gpt4 book ai didi

c# - .NET XPathNavigator 未找到 XPath 查询中指定的元素(但 XPath 查询在 XMLSpy 中有效)

转载 作者:行者123 更新时间:2023-12-03 17:32:02 25 4
gpt4 key购买 nike

我有以下 C# 代码片段来使用 XPath 在正在输入的 XML 文件中查找错误:

string xml; // the XML is passed as a parameter as the string below
using (Stream messageStream = new MemoryStream(xml))
{
IXPathNavigable source = new XPathDocument(messageStream);
XPathNavigator navigator = source.CreateNavigator();
object evaResult = navigator.Evaluate("boolean(/thinktransferDataSet/ErrorLog)"); // returns false
XPathNodeIterator iterator = navigator.Select("/thinktransferDataSet/ErrorLog/sKey"); // returns empty iterator

// Assert evaResult is true and iterator has elements. Both assertions fail
}

这是 XML 文件的文本:
<?xml version="1.0" standalone="yes"?>
<thinktransferDataSet xmlns="http://tempuri.org/thinktransferDataSet1.xsd">
<ProcessHeader>
<sKey>uniqueId</sKey>
<sApplication>appname</sApplication>
<sUser>username</sUser>
<dtProcessDate>Oct 8 2015 9:58AM</dtProcessDate>
<iProcessId>5132</iProcessId>
<iTranFailureCount>2</iTranFailureCount>
<iTranSuccessCount>0</iTranSuccessCount>
</ProcessHeader>
<ErrorLog>
<sKey>uniqueId</sKey>
<sLevel>ERROR</sLevel>
<sDescription>Error in table :tablename Row:1 - Column 'comments' exceeds the MaxLength limit.</sDescription>
<sSource>69</sSource>
<dtDate>Oct 8 2015 9:59AM</dtDate>
</ErrorLog>
<ErrorLog>
<sKey>uniqueId</sKey>
<sLevel>ERROR</sLevel>
<sDescription>Test error description</sDescription>
<sSource>69</sSource>
<dtDate>Oct 8 2015 9:59AM</dtDate>
</ErrorLog>
</thinktransferDataSet>

错误由 XML 中存在的一个或多个元素指示。但是,对于 navigator.Evaluate 和 navigator.Select 元素下方的测试消息,即使这些 XPath 字符串在 XMLSpy 中完全工作,也根本找不到元素或 ErrorLog/sKey 元素。这里可能是什么问题?

非常感谢!

最佳答案

为了选择属于命名空间的元素,在任何 XPath 表达式中,它们的名称必须以与该命名空间相关联的前缀作为前缀。您可以阅读更详细的答案here .根据您的代码,您可以对其进行更改以使其正常工作:

    IXPathNavigable source = new XPathDocument(messageStream);
var xmlNamespaceManager = new XmlNamespaceManager(navigator.NameTable);
xmlNamespaceManager.AddNamespace("x", "http://tempuri.org/thinktransferDataSet1.xsd");
object evaResult = navigator.Evaluate("boolean(/x:thinktransferDataSet/x:ErrorLog)", xmlNamespaceManager);
XPathNodeIterator iterator = navigator.Select("/x:thinktransferDataSet/x:ErrorLog/x:sKey", xmlNamespaceManager);

关于c# - .NET XPathNavigator 未找到 XPath 查询中指定的元素(但 XPath 查询在 XMLSpy 中有效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33220388/

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