C# Xpath无法分析XML:需要命名空间管理器或XsltContext
我希望找到元素C# Xpath无法分析XML:需要命名空间管理器或XsltContext,c#,xml,xpath,C#,Xml,Xpath,我希望找到元素 r with s:id = {5FF71EB5-BE2D-49DC-9442-B3DCE15067C9} 它的带有 uid="{00000000-0000-0000-0000-000000000000}" 然后在最后输出s:name(“Bar1”) 我已经编写了这段xpath,它正是这样做的 string(//r[@s:id='{5FF71EB5-BE2D-49DC-9442-B3DCE15067C9}']//rule[@uid='{00000000:0000:0000:0
r with s:id = {5FF71EB5-BE2D-49DC-9442-B3DCE15067C9}
它的
带有
uid="{00000000-0000-0000-0000-000000000000}"
然后在最后输出s:name(“Bar1”)
我已经编写了这段xpath,它正是这样做的
string(//r[@s:id='{5FF71EB5-BE2D-49DC-9442-B3DCE15067C9}']//rule[@uid='{00000000:0000:0000:0000:000000000000}']/@s:name)
验证地点:
我的错误是:需要名称空间管理器或XsltContext。此查询具有前缀、变量或用户定义的函数
我通过大量的挖掘发现我的名称空间没有正确设置。但我一辈子都搞不清楚我做错了什么
我的命名空间分配应该是什么样子的?您必须向导航器提供命名空间管理器。处理异常,但SelectSingleNode返回null。因此,我更改了XPath(前缀//以搜索所有节点)。这会找到节点,但Value属性是空字符串,因此我将其更改为OuterXml。我的最终版本如下:
var xpath = "//r[@s:id='{5FF71EB5-BE2D-49DC-9442-B3DCE15067C9}']//rule[@uid='{00000000-0000-0000-0000-000000000000}']";
var result = nav.SelectSingleNode(xpath, xmlnsManager);
Console.WriteLine(result.OuterXml);
// Prints: "<rule uid=\"{00000000-0000-0000-0000-000000000000}\" s:name=\"Bar1\" xmlns:s=\"s\"></rule>"
var xpath=“//r[@s:id=”{5FF71EB5-BE2D-49DC-9442-B3DCE15067C9}]//规则[@uid=”{00000000-0000-0000-00000000000000}];
var result=nav.SelectSingleNode(xpath,xmlnsManager);
WriteLine(result.OuterXml);
//印刷品:“
var xmlStringReader = new StringReader(xmlfile);
XmlReaderSettings set = new XmlReaderSettings();
set.ConformanceLevel = ConformanceLevel.Fragment;
XPathDocument doc =
new XPathDocument(XmlReader.Create(xmlStringReader, set));
XPathNavigator nav = doc.CreateNavigator();
var xmlnsManager = new XmlNamespaceManager(nav.NameTable);
xmlnsManager.AddNamespace("p", "p" );
xmlnsManager.AddNamespace("s", "s" );
var xpath ="r[@s:id='{5FF71EB5-BE2D-49DC-9442-B3DCE15067C9}']//rule[@uid='{00000000-0000-0000-0000-000000000000}']";
string result = nav.SelectSingleNode(xpath).Value;
var xpath = "//r[@s:id='{5FF71EB5-BE2D-49DC-9442-B3DCE15067C9}']//rule[@uid='{00000000-0000-0000-0000-000000000000}']";
var result = nav.SelectSingleNode(xpath, xmlnsManager);
Console.WriteLine(result.OuterXml);
// Prints: "<rule uid=\"{00000000-0000-0000-0000-000000000000}\" s:name=\"Bar1\" xmlns:s=\"s\"></rule>"