PDA

Просмотр полной версии : Требуется помощь по XML


Marat Timergaliev
11.04.2009, 11:30
плиз кто нибудь помогите мне...
вот такая ошибка при регистрации пользователя с помощью эксэмэлки

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:


Line 52: n.AppendChild(n6);
Line 53: XmlNode uzel = x.SelectSingleNode("/users");
Line 54: uzel.AppendChild(n);
Line 55: x.Save("C:\\Documents and Settings\\marik\\Мои документы\\Visual Studio 2005\\WebSites\\WebSite1\\users.xml");
Line 56: Session["name"] = TextBox1.Text;

Marat Timergaliev
11.04.2009, 11:34
а еще более точнее ругается на 54 строчку

Timur Naimov
11.04.2009, 12:42
Line 52: n.AppendChild(n6);
Line 53: XmlNode uzel = x.SelectSingleNode("/users");
Line 54: uzel.AppendChild(n);
Line 55: x.Save("C:\\Documents and Settings\\marik\\Мои документы\\Visual Studio 2005\\WebSites\\WebSite1\\users.xml");
Line 56: Session["name"] = TextBox1.Text;

Информация очень скудная, но как я понял проблема в объекте "uzel". Приведенное Вами исключение возникает есть объект объявлен, но не инициализарован, т.е. "uzel = null". В этой строчке обращение происходит к двум объектам - "uzel" и "n". Учитывая, что к "n" Вы удачно обращаетесь выше, проблема в том что uzel равно null.

SelectSingleNode - The first XmlNode that matches the XPath query or null reference (Nothing in Visual Basic) if no matching node is found

Другими словами "x.SelectSingleNode("/users");" ничего не находит в xml документе, соответственно возвращает null, соответственно при попытки обраться к null происходит исключение.
Выложите свой xml файлик

Marat Timergaliev
11.04.2009, 20:46
вот я убрал вообще 53 и 54 строчки, но почему то не добавляются пользователи в ЭКСЭМЛ, хотя когда захожу обратно в вижуал студию мне говорит что мол в эксэмл было что то добавлено, и спришивает обновить и добавить туда??но там ничего нету вообще

Erkin Kuchkarov
11.04.2009, 21:20
a posle izmenenya xml zapisivaete ili prosto menyaete DOM v pamyati?
cod i xml v studiu

Marat Timergaliev
12.04.2009, 16:15
вот код на кнопке для добавления в XML я убрал выше упомянутую строчку 53-54
XmlDocument x = new XmlDocument();
x.Load("C:\\Documents and Settings\\marik\\Мои документы\\Visual Studio 2005\\WebSites\\WebSite1\\users.xml");
XmlNode xy=x.SelectSingleNode("/users/user[name='"+TextBox1.Text+"']");
if (xy == null)
{
//this means that we haven't gotten a
//match for the name so let's create a
//new user element and add it to the
//tree
XmlNode n = x.CreateElement("user");
XmlNode n1 = x.CreateElement("nik");
n1.InnerText = TextBox1.Text;
n.AppendChild(n1);
XmlNode n2 = x.CreateElement("name");
n2.InnerText = TextBox2.Text;
n.AppendChild(n2);
XmlNode n3 = x.CreateElement("lastname");
n3.InnerText = TextBox3.Text;
n.AppendChild(n3);
XmlNode n4 = x.CreateElement("sorename");
n4.InnerText = TextBox4.Text;
n.AppendChild(n4);
XmlNode n5 = x.CreateElement("e-mail");
n5.InnerText = TextBox5.Text;
n.AppendChild(n5);
XmlNode n6 = x.CreateElement("password");
n6.InnerText = FormsAuthentication.
HashPasswordForStoringInConfigFile(TextBox6.Text, "sha1");
n.AppendChild(n6);
// XmlNode uzel = x.SelectSingleNode("/users");
//uzel.AppendChild(n);
x.Save("C:\\Documents and Settings\\marik\\Мои документы\\Visual Studio 2005\\WebSites\\WebSite1\\users.xml");
Session["name"] = TextBox1.Text;
FormsAuthentication.RedirectFromLoginPage(TextBox1 .Text, false);
}
else
{
Label2.Text = "this user already exists";
}

Marat Timergaliev
12.04.2009, 16:17
а вот и сам ЭКСЭМЛ, но только почему то не добваляется сюда ничего, скажите как правильно делать???
<users>
<user>
<nik>
</nik>
<name>
</name>
<lastname>
</lastname>
<sorename>
</sorename>
<e-mail>
</e-mail>
<password>
</password>
</user>
</users>

Marat Timergaliev
12.04.2009, 16:19
жесть надоело все, почему не получается, аа?? вот проблемка есть, решится, сразу другая, ваще

Erkin Kuchkarov
12.04.2009, 16:29
XmlNode xy=x.SelectSingleNode("/users/user[name='"+TextBox1.Text+"']");
"name" определен как аттрибут похоже... Ошибся Я
<users> нужно определять "." (так как это root)... ща покапаюсь у себя в старье

Но все же конструкция должна быть следующей:
XmlNode xy=x.SelectSingleNode(".[user/name="+TextBox1.Text+"]");
(проверить не могу - васик не понимаю)

Marat Timergaliev
12.04.2009, 21:22
XmlNode xy=x.SelectSingleNode("/users/user[name='"+TextBox1.Text+"']");
"name" определен как аттрибут похоже... Ошибся Я
<users> нужно определять "." (так как это root)... ща покапаюсь у себя в старье

Но все же конструкция должна быть следующей:
XmlNode xy=x.SelectSingleNode(".[user/name="+TextBox1.Text+"]");
(проверить не могу - васик не понимаю)
не это не помогло, ругается теперь на вашу строчку мол не правильно написано

Erkin Kuchkarov
12.04.2009, 21:27
не это не помогло, ругается теперь на вашу строчку мол не правильно написано
Похоже я напутал с апострофами... я же сказал что не знаю васика.

Timur Naimov
13.04.2009, 13:57
В общем так:
изначально имеем xml файл

<users>
</users>


код для добавления пользователя:

XmlDocument x = new XmlDocument();
x.Load(@"C:\temp\xml\users.xml");
XmlNode n = x.CreateElement("user");
XmlNode n1 = x.CreateElement("nik");
n1.InnerText = "312 nik text";
n.AppendChild(n1);
XmlNode n2 = x.CreateElement("name");
n2.InnerText = "name text";
n.AppendChild(n2);
XmlNode n3 = x.CreateElement("lastname");
n3.InnerText = "last name text";
n.AppendChild(n3);
XmlNode n4 = x.CreateElement("sorename");
n4.InnerText = "sorename text";
n.AppendChild(n4);
XmlNode n5 = x.CreateElement("e-mail");
n5.InnerText = "email text";
n.AppendChild(n5);
XmlNode n6 = x.CreateElement("password");
n6.InnerText = "password";
n.AppendChild(n6);
x.DocumentElement.AppendChild(n);
x.Save(@"C:\temp\xml\users.xml");


результат нескольких выполнений:

<users>
<user>
<nik>123 nik text</nik>
<name>name text</name>
<lastname>last name text</lastname>
<sorename>sorename text</sorename>
<e-mail>email text</e-mail>
<password>password</password>
</user>
<user>
<nik>312 nik text</nik>
<name>name text</name>
<lastname>last name text</lastname>
<sorename>sorename text</sorename>
<e-mail>email text</e-mail>
<password>password</password>
</user>
</users>


Все работает нормально.

Запрос для поиска значения в документе:

x.DocumentElement.SelectSingleNode("user[name='test name text']");

В данном случае будут найдены все элементы '<user>' у которых дочерний элемент '<name>' равен 'test name text'. Можете использовать его для проверки существования пользователя в xml документе.

Timur Naimov
13.04.2009, 14:18
Еще одна версия записи, немного абстрагированная от DOM

XmlDocument x = new XmlDocument();
x.Load(@"C:\temp\xml\users.xml");

XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;

StringBuilder l_outputXml = new StringBuilder();

XmlWriter l_xmlWriter = XmlWriter.Create(l_outputXml, settings);

l_xmlWriter.WriteStartElement("user");
l_xmlWriter.WriteElementString("nik", "test nik");
l_xmlWriter.WriteElementString("name", "test name");
l_xmlWriter.WriteElementString("lastname", "test lastname");
l_xmlWriter.WriteElementString("sorename", "test sorename");
l_xmlWriter.WriteElementString("email", "test email");
l_xmlWriter.WriteElementString("password", "test password");
l_xmlWriter.WriteEndElement();

l_xmlWriter.Flush();

x.DocumentElement.InnerXml += l_outputXml.ToString();
x.Save(@"C:\temp\xml\users.xml");

shumbola
13.04.2009, 18:54
изначально имеем xml файл
А слабо когда изначально ничего нет? :-)

Наверняка топикстартеру и такой вариант понадобиться.

Marat Timergaliev
13.04.2009, 20:06
спасибо большое

Marat Timergaliev
13.04.2009, 20:08
просто я создавал не правильный узел который возвращал 0, а нужно было вместо 53-54 строчки x.DocumentElement.AppendChild(n);

Timur Naimov
13.04.2009, 20:29
А слабо когда изначально ничего нет? :-)
Я вижу смайлик, но тем не менее напрашивается вопрос - Это Вы серьезно?

На всякий случай

string l_filePath = @"C:\temp\xml\users.xml";

bool l_isFileExist = File.Exists(l_filePath);

XmlElement l_root;

XmlDocument l_xmlDoc = new XmlDocument();
if (l_isFileExist)
{
l_xmlDoc.Load(l_filePath);
l_root = l_xmlDoc.DocumentElement;
}
else
{
l_root = l_xmlDoc.CreateElement("users");
l_xmlDoc.AppendChild(l_root);
}

XmlNode n = l_xmlDoc.CreateElement("user");
XmlNode n1 = l_xmlDoc.CreateElement("nik");
n1.InnerText = "312 nik text";
n.AppendChild(n1);
XmlNode n2 = l_xmlDoc.CreateElement("name");
n2.InnerText = "name text";
n.AppendChild(n2);
XmlNode n3 = l_xmlDoc.CreateElement("lastname");
n3.InnerText = "last name text";
n.AppendChild(n3);
XmlNode n4 = l_xmlDoc.CreateElement("sorename");
n4.InnerText = "sorename text";
n.AppendChild(n4);
XmlNode n5 = l_xmlDoc.CreateElement("e-mail");
n5.InnerText = "email text";
n.AppendChild(n5);
XmlNode n6 = l_xmlDoc.CreateElement("password");
n6.InnerText = "password";
n.AppendChild(n6);

l_root.AppendChild(n);

l_xmlDoc.Save(l_filePath);


Кстати, прошу прощения за небольшое упущение в коде примера с XmlWriter, только что заметил - отстутствует явное закрытие XmlWriter. Или его объявление нужно было поместить в блок using (я очень торопился - хотелось помочь человеку и была куча другой работы в тоже время). Тем не менее, это не является очень большой проблемой, так как сборщик мусора достаточно умен чтобы самостоятельно освободить ресурс. Но это, конечно, не значит что явно освобождать ресурсы не надо...

shumbola
13.04.2009, 20:43
Я вижу смайлик
Смайлик не зря стоял. ;-)

shumbola
13.04.2009, 20:47
l_
Это из какой умной книжки? ;-)

Timur Naimov
13.04.2009, 20:52
Это из какой умной книжки? ;-)
Это наше внутренне соглашение об именах. "l_" означает "local" - всмысле локальная переменная в пределах видимости функции. Придумали до меня, просто привык уже и автоматически так "пишу" :)

shumbola
13.04.2009, 20:59
Это из какой умной книжки? ;-)
Это наше внутренне соглашение об именах. "l_" означает "local" - всмысле локальная переменная в пределах видимости функции. Придумали до меня, просто привык уже и автоматически так "пишу" :)

Да, я понял. Бесполезно это все. У МС тоже забавное соглашение имен. По крайней мере было, сейчас незнаю. :-)

Timur Naimov
13.04.2009, 21:11
Да, я понял. Бесполезно это все. У МС тоже забавное соглашение имен. По крайней мере было, сейчас незнаю. :-)
Мы, в целом, стараемся придерживаться этого - http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx
Хотя, конечно, все эти соглашения по большей части дань традициям. Кроме того, с недавнего времени насильно заставляют комментировать код xml тегами (изверги :))...

Marat Timergaliev
13.04.2009, 21:34
извините, я просто только учусь, поэтому вопросов еще будет много, так что если не трудно помогайте осваивать
вопрос?
у меня опять проблема только вот такая на этот раз
при нажатии на кнопку не переходит на другую страницу, хотя до того когда использовал проверку пользователя через БД сервер 2005 было норм, а как изменил код c использованием XML перестало переходить, а по нажатию 3 раза на кнопку он вообще говорит не возможно отобразить страницу

Marat Timergaliev
13.04.2009, 21:35
а чтобы меньше вопросов задавал, пришлите мне плиз код интернет магазина на асп с коментами чтобы я все разобрал сам сразу без того чтобы залазить на форум и ждать когда ответ получу, так будет проще, если можно конечно

Timur Naimov
13.04.2009, 21:44
извините, я просто только учусь, поэтому вопросов еще будет много, так что если не трудно помогайте осваивать
Марик, помогать не трудно если Вы будете выкладывать технические детали - код и более подробное описание. Очень сложно понять проблему из того что Вы описали выше. Почему не переходит, куда не переходит... "кто этот потерпевший" (С) Мимино.
Кстати, используете ли Вы средства аутентификации/авторизации ASP.NET (Forms Authentication и Membership) или что-то свое изобретаете?

Timur Naimov
13.04.2009, 21:47
а чтобы меньше вопросов задавал, пришлите мне плиз код интернет магазина на асп с коментами чтобы я все разобрал сам сразу без того чтобы залазить на форум и ждать когда ответ получу, так будет проще, если можно конечно
:)...
Я бы прислал, только Microsoft Commerce Server, к сожалению, не доступен в исходниках.

Посмотрите http://www.asp.net/community/projects/ или http://www.codeplex.com/

shumbola
13.04.2009, 22:15
Да, я понял. Бесполезно это все. У МС тоже забавное соглашение имен. По крайней мере было, сейчас незнаю. :-)
Мы, в целом, стараемся придерживаться этого - http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx
Хотя, конечно, все эти соглашения по большей части дань традициям. Кроме того, с недавнего времени насильно заставляют комментировать код xml тегами (изверги :))...

А не лучше ли придерживаться вот этим http://msdn.microsoft.com/en-us/library/ms229045(VS.85).aspx? ;-)

Marat Timergaliev
13.04.2009, 22:33
Да, я понял. Бесполезно это все. У МС тоже забавное соглашение имен. По крайней мере было, сейчас незнаю. :-)
Мы, в целом, стараемся придерживаться этого - http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx
Хотя, конечно, все эти соглашения по большей части дань традициям. Кроме того, с недавнего времени насильно заставляют комментировать код xml тегами (изверги :))...

А не лучше ли придерживаться вот этим http://msdn.microsoft.com/en-us/library/ms229045(VS.85).aspx? ;-)
честно говоря лопать мсдн в нете я запарюсь, у меня нет долго открывает а уже тем более почему то мсдн мс-овтовский

shumbola
13.04.2009, 22:37
честно говоря лопать мсдн в нете я запарюсь, у меня нет долго открывает а уже тем более почему то мсдн мс-овтовский

Это было адресовано Тимуру. :-)

Marat Timergaliev
13.04.2009, 22:39
насчет кнопки, по нажатию кнопки регистрация нового пользователя на главной страницы, должен быть переход на страницу регистрации(это раньше происходило, а ща нет) код для перехода я не пишу, через свойства кнопки в Вижуал Студии я выбирая куда по нажатию она должна вести, а че так не правильно, раньше работало

Marat Timergaliev
13.04.2009, 22:46
честно говоря лопать мсдн в нете я запарюсь, у меня нет долго открывает а уже тем более почему то мсдн мс-овтовский

Это было адресовано Тимуру. :-)

а ну да точно

Timur Naimov
13.04.2009, 23:14
А не лучше ли придерживаться вот этим http://msdn.microsoft.com/en-us/libr...45(VS.85).aspx? ;-)
Много общего, практически тоже самое :) По сути все что Microsoft советует имеет одни и теже корни, с небольшими уточнениями для конкрентых задач. Мне как-то ближе рекомендации для разработки библиотек.

Тут недавно Эркин ака показывал свои архивы - то что он давным-давно писал... Особенно понравилось название funkciya_odinadcat :)

shumbola
13.04.2009, 23:17
название funkciya_odinadcat
He-he-he...я никогда так не писал, думаю и сейчас так не смогу. :-)

Marat Timergaliev
13.04.2009, 23:20
во а где можно посмотреть архивы эти, мне было бы интересно посмотреть код, а на каком языке??

Timur Naimov
13.04.2009, 23:21
насчет кнопки, по нажатию кнопки регистрация нового пользователя на главной страницы, должен быть переход на страницу регистрации(это раньше происходило, а ща нет) код для перехода я не пишу, через свойства кнопки в Вижуал Студии я выбирая куда по нажатию она должна вести, а че так не правильно, раньше работало
И сейчас должно работать если не меняли свойства кнопки. Выложите определение кнопки из aspx файла (теги).
Все таки настоятельно рекомендую Вам ознакомится с системой безопасности asp.net, вот отличная серия статей - http://www.asp.net/learn/security/

shumbola
13.04.2009, 23:24
Много общего, практически тоже самое
Вы вчитайтесь, мне показалось не тоже самое. Hint: Hungarian notation.

Timur Naimov
13.04.2009, 23:25
во а где можно посмотреть архивы эти, мне было бы интересно посмотреть код, а на каком языке??
Я ж Вам дал 2 ссылки. На codeplex ВСЕ доступно в исходниках, огромное количество проектов включая несколько CMS на asp.net, С#. Неужели мало???

Marat Timergaliev
13.04.2009, 23:28
<asp:Button ID="Button2" runat="server" Style="left: 8px; position: absolute;
top: 209px; z-index: 106;" Text="Registration" Width="218px" OnClick="Button2_Click" PostBackUrl="~/login.aspx" />&nbsp;

Timur Naimov
13.04.2009, 23:40
Вы вчитайтесь, мне показалось не тоже самое. Hint: Hungarian notation.
Вы к тому, что

Do not use Hungarian notation.

Так ведь они для "публичных" элементов советуют.. всмысле для классов, свойств, событий и т.д. То что будет доступно другим разработчикам. А мы используем префиксы только во внутренних структурах, которые невидимы для внешнего мира :)

Timur Naimov
13.04.2009, 23:48
<asp:Button ID="Button2" runat="server" Style="left: 8px; position: absolute;
top: 209px; z-index: 106;" Text="Registration" Width="218px" OnClick="Button2_Click" PostBackUrl="~/login.aspx" />&
Должно работать, но
1. Зачем кнопке обработчик события "OnClick", если она просто ведет на другую страницу. Почему бы не использовать для такой задачи HTML кнопку, всмысле "<input id="Button1" type="button" value="button" />"
2. Какой код в обработчике
3. Почему "position: absolute"

shumbola
13.04.2009, 23:59
А мы используем префиксы только во внутренних структурах
Да ради бога, используйте. Я не против. ;-)

Marat Timergaliev
14.04.2009, 07:24
<asp:Button ID="Button2" runat="server" Style="left: 8px; position: absolute;
top: 209px; z-index: 106;" Text="Registration" Width="218px" OnClick="Button2_Click" PostBackUrl="~/login.aspx" />&
Должно работать, но
1. Зачем кнопке обработчик события "OnClick", если она просто ведет на другую страницу. Почему бы не использовать для такой задачи HTML кнопку, всмысле "<input id="Button1" type="button" value="button" />"
2. Какой код в обработчике
3. Почему "position: absolute"
а какой позишн надо?? онклик наверное потому что по нажатию на кнопку?? я в асп это не проприсываю, это само там так, я только через свойства и aspx.cs пишу код

Erkin Kuchkarov
14.04.2009, 11:50
а какой позишн надо??
relative :) (разницы большой нет... просто экраны у всех разные)

Marat Timergaliev
14.04.2009, 12:31
просто если я использую релатив, у меня после компиляции, все что релатив стоит, начинает сбиваться в позициях, не впопад все стоит

Erkin Kuchkarov
14.04.2009, 13:19
просто если я использую релатив
Правильно... потому и абсолют нужен :)

Timur Naimov
14.04.2009, 13:37
а какой позишн надо?? онклик наверное потому что по нажатию на кнопку?? я в асп это не проприсываю, это само там так, я только через свойства и aspx.cs пишу код
Замените кнопку на HTML <input> (можно просто перетащить из toolbox в visual studio). Зачем Вам асп кнопка еще и с обработчиком событий, когда нужно просто перейти на другую страницу? С Вашими настройками абсолютной позиции у меня кнопка оказалась примерно в центре экрана... это нормально? Если Вы пока испытываете сложности с HTML то используйте табличную верстку.

Как я понимаю мои призивы остались невостребованными...

Erkin Kuchkarov
14.04.2009, 14:07
Как я понимаю мои призивы остались невостребованными...

Ты хотел написать "позывы"? ;)