gpt4 book ai didi

c# - C# 中的 XPATH 问题

转载 作者:行者123 更新时间:2023-12-03 07:04:15 24 4
gpt4 key购买 nike

好吧,我一整天都在为 XPATH 和 C# 中的这个问题而烦恼。

我有以下 XML 文档:

<entry xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0"     xmlns:c="http://base.google.com/cns/1.0">
<item id="362">
<title>Family Holiday</title>
<description>a long, wordy description goes here</description>
<g:id xmlns:g="g">FPS</g:id>
<g:latitude xmlns:g="g">42.502260</g:latitude>
<g:longitude xmlns:g="g">1.532850</g:longitude>
</item>
</entry>

然后我执行以下操作:

XmlDocument _xmlDocument = new XmlDocument();
_xmlDocument.Load(xmlfile);

XmlNamespaceManager _nameSpaceManager = new XmlNamespaceManager(_xmlDocument.NameTable);
_nameSpaceManager.AddNamespace("RN", "http://www.w3.org/2005/Atom");
_nameSpaceManager.AddNamespace("g", "http://base.google.com/ns/1.0");
_nameSpaceManager.AddNamespace("c", "http://base.google.com/cns/1.0");

XPathNavigator navigator = _xmlDocument.CreateNavigator();

我的问题在于:

XmlNode nde = _xmlDocument.SelectSingleNode("/RN:entry/RN:item/g:id", _nameSpaceManager);

返回 null - 不是 Id 节点。然而,

XmlNode nde = _xmlDocument.SelectSingleNode("/RN:entry/RN:item/RN:title", _nameSpaceManager);

确实返回标题节点。

任何关于我做错了什么的想法将不胜感激!

干杯西蒙

最佳答案

您的本地命名空间声明将覆盖根命名空间定义;

<g:id xmlns:g="g">FPS</g:id>

实际上是说这里的 g:id 属性来自命名空间“g”,这与 g 定义为来自文档元素的命名空间不同。

例如,如果我将您的 XML 更改为:

  string xml = @"<entry xmlns=""http://www.w3.org/2005/Atom"" xmlns:g=""http://base.google.com/ns/1.0""     xmlns:c=""http://base.google.com/cns/1.0"">
<item id=""362"">
<title>Family Holiday</title>
<description>a long, wordy description goes here</description>
<g:id xmlns:g=""http://base.google.com/ns/1.0"">FPS</g:id>
<g:latitude xmlns:g=""http://base.google.com/ns/1.0"">42.502260</g:latitude>
<g:longitude xmlns:g=""http://base.google.com/ns/1.0"">1.532850</g:longitude>
</item>
</entry>";

或者简单地说:

string xml = @"<entry xmlns=""http://www.w3.org/2005/Atom"" xmlns:g=""http://base.google.com/ns/1.0""     xmlns:c=""http://base.google.com/cns/1.0"">
<item id=""362"">
<title>Family Holiday</title>
<description>a long, wordy description goes here</description>
<g:id>FPS</g:id>
<g:latitude>42.502260</g:latitude>
<g:longitude>1.532850</g:longitude>
</item>
</entry>";

您的 XPath 表达式用作 g 的本地命名空间,现在与 g 的文档元素命名空间声明匹配

如果您对 XML 感到困惑,那么您唯一能做的就是:

XmlNamespaceManager _nameSpaceManager = new XmlNamespaceManager(_xmlDocument.NameTable);
_nameSpaceManager.AddNamespace("RN", "http://www.w3.org/2005/Atom");
_nameSpaceManager.AddNamespace("g", "g");
_nameSpaceManager.AddNamespace("c", "http://base.google.com/cns/1.0");

您的 XPath 现在可以工作了。

使用 XmlDocument、.Net Framework 版本 4 进行测试。

关于c# - C# 中的 XPATH 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12899415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com