Класс XMLDocument - дочерние узлы - сокращенная загрузка по сравнению с полной загрузкой
Я изучаю класс XMLDocument
https://msdn.microsoft.com/en-us/library/system.xml.xmldocument(v=vs.110).aspx
Я использую вышеупомянутый сайт, чтобы напечатать в примерах. Я набрал в примере, чтобы получить дочерние узлы, и это работает. Мой вопрос: почему это не работает, когда я использую полный XML-документ, содержащий более одной книги? Что касается кода, то его нужно изменить, чтобы он работал, когда я использую его с полным XML-документом.
XmlDocument doc = new XmlDocument();
doc.LoadXml("<book ISBN='1-861001-57-5'>" +
"<title>Pride And Prejudice</title>" +
"<price>19.95</price>" +
"</book>");
XmlNode root = doc.FirstChild;
//Display the contents of the child nodes.
if (root.HasChildNodes)
{
for (int i=0; i<root.ChildNodes.Count; i++)
{
Console.WriteLine(root.ChildNodes[i].InnerText);
}
}
Полная загрузка XML, которую я использую, приведена ниже. Он был скопирован с https://msdn.microsoft.com/en-us/library/system.xml.xmldocument(v=vs.110).aspx
doc.LoadXml("<?xml version=\"1.0\"?> \n" +
"<books xmlns=\"http://www.contoso.com/books\"> \n" +
"<book genre=\"novel\" ISBN=\"1-861001-57-8\"publicationdate=\"1823-01-
28\">\n"+
" <title>Pride And Prejudice</title> \n" +
" <price>24.95</price> \n" +
" </book> \n" +
"<book genre=\"novel\" ISBN=\"1-861002-30-1\"ublicationdate=\"1985-01-
01\">\n" +
" <title>The Handmaid's Tale</title> \n" +
" <price>29.95</price> \n" +
" </book> \n" +
"</books>");
1 ответ
Поскольку первый узел <?xml version="1.0"?>
, книги не в doc.FirstChild
но в doc.DocumentElement;
XmlNode root = doc.DocumentElement;
В вашем примере XML, корень документа book
и дочерние узлы title
а также price
, Но если вы хотите иметь несколько books
каждый дочерний узел является book
не title
или же price
, так что вам нужно получить доступ к ним по имени или итерации, чтобы перейти на следующий уровень.
foreach(XmlNode book in root)
{
Console.WriteLine("Title: {0}\r\nPrice: {1}",
book["title"].InnerText,
book["price"].InnerText);
}
Или в качестве альтернативы:
foreach (XmlNode book in root)
{
foreach (XmlNode attribute in book)
{
Console.WriteLine(attribute.InnerText);
}
}