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】:
如果您想要的只是存储在<Text>
属性中的值,则无需遍历所有内容,请尝试以下操作:
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但可以遍历节点?的主要内容,如果未能解决你的问题,请参考以下文章