C # не может запрашивать XML, но может проходить узлы? - PullRequest
0 голосов
/ 27 сентября 2019

Относительно моего другого вопроса .

Я пытаюсь прочитать узел из файла XML, который выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" ?>
<AuthorIT>
    <Objects>
        <Media>don't care</Media>
        <Style>don't care</Style>
        <Book>don't care</Book>
        <Topic>don't care</Topic>
        <Topic>
            <Object>
                <Description>Performance Evidence</Description>
            </Object>
            <Text>This is what I want to select</Text>
        </Topic>
    </Objects>
</AuthorIT>

Но я могуне опрашиваю.Я пробовал XmlDocument, XPath и Linq to XML.

На http://XPather.com я подтвердил, что мой XPath правильный.


            /* this doesn't work but the XPath has been verified */
            XPathNavigator nav;
            XPathDocument docNav;
            string xPath;

            docNav = new XPathDocument(localFile);
            nav = docNav.CreateNavigator();
            xPath = "//Topic[Object/Description = 'Performance Evidence']/Text";
            string value = nav.SelectSingleNode(xPath).Value;

Я могу пройти через узлы XMLиспользуя XmlDocument, но я не хочу серию вложенных циклов foreach вместо одного запроса.

 XmlDocument doc = new XmlDocument();
 doc.Load(localFile);
 XmlNodeList xmlNodes = doc.SelectNodes("/");

 /* direct query doesn't work, but traversing the nodes does? */
 foreach (XmlNode node in xmlNodes)
 {
     if (node.Name == "#document")
     {
         foreach (XmlNode subNode in node.ChildNodes)
         {
             if (subNode.Name == "AuthorIT")
             {
                 foreach (XmlNode subSubNode in subNode.ChildNodes)
                 {
                     if (subSubNode.Name == "Objects")
                     {
                         foreach (XmlNode subSubSubNode in subSubNode.ChildNodes)
                         {
                             if (subSubSubNode.Name == "Topic")
                             {
// I didn't finish writing this, because it's a ridiculous way to do it... but it works
                             }
                         }
                     }
                 }
             }
         }
     }
 }

Есть ли что-то, что я делаю неправильно?

Какое свойство документа XML может вызвать это?(если так, как мне обойти это?)

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Нет необходимости перебирать все, если вам нужно только значение, хранящееся в атрибуте <Text>, попробуйте следующее:

var doc = XDocument.Parse(File.ReadAllText(filePath));
var value = doc.XPathSelectElement("/AuthorIT/Objects/Topic/Text").Value;
0 голосов
/ 30 сентября 2019

То, что я оставил в примере XML, было ключом к решению ... Пространство имен!

Я нашел ответ на этот другой вопрос: Использование Xpath с пространством имен по умолчанию в C #

...