C#不能查询XML但可以遍历节点?

Posted

技术标签:

【中文标题】C#不能查询XML但可以遍历节点?【英文标题】:C# can't query XML but can traverse the nodes? 【发布时间】:2020-01-27 12:48:10 【问题描述】:

与my other question相关。

我正在尝试从 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;

我可以使用 XmlDocument 遍历 XML 节点,但我不希望使用一系列嵌套的 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 文档的某些属性? (如果是这样,我该如何解决?)

【问题讨论】:

这是什么#document 是我SelectNodes("/")时最顶层节点的名字。它似乎是位于“根”节点之上的“文档”节点。 【参考方案1】:

如果您想要的只是存储在&lt;Text&gt; 属性中的值,则无需遍历所有内容,请尝试以下操作:

var doc = XDocument.Parse(File.ReadAllText(filePath));
var value = doc.XPathSelectElement("/AuthorIT/Objects/Topic/Text").Value;

【讨论】:

【参考方案2】:

我在示例 XML 中遗漏的是解决方案的关键...命名空间!

我在另一个问题上找到了答案:Using Xpath With Default Namespace in C#

【讨论】:

以上是关于C#不能查询XML但可以遍历节点?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中循环遍历 XML 的特定节点

遍历xml文件并将内容存储在Textfield c#中

计算特定XML节点c#的子节点数[重复]

c# Dictionary的遍历和排序(转)

要遍历的节点不能为空(Hibernate SQL)

C#中 xml文件遍历?