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

我有以下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);

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

ASP.NET Core 2.0中的多个身份 - c#

我正在将ASP.NET Core 1.0应用程序迁移到ASP.NET Core 2.0。在我的启动中,我正在配置两个身份:services.AddIdentity<IdentityUser, IdentityRole>(configureIdentity) .AddDefaultTokenProviders() .AddUserStore<…

.Net LINQ-使用其他字典过滤字典 - c#

我有两个相同类型的字典,A和B。Dictionary<string, IEnumerable<object>> 我使用对象来表示具有属性“ Id”的复杂类型。我正在寻找A中具有B中存在的对象(使用Id)但在另一个键下的所有项目。基本上是要判断对象是否已移动键。 A是新字典,B是旧字典。有没有使用LINQ完成此操作的合理方法?我希望结果…

将asp.net.core 2.0应用发布到IIS时JavaScript无法运行 - javascript

我是这里的新手。我有一个VS2017 asp.net C#Web应用程序。我目前不在使用Angular。这是一个简单的网站。我隐藏了div,当用户单击菜单项时,相关的div出现,而我隐藏了其余的div。我使用JavaScript完成此任务。在开发和IIS Express中,它可以工作。当我发布到IIS时,它不起作用。静态页面显示“确定”,但菜单按钮不执行任何…

ASP.net C#崩溃一行 - c#

我有一个母版页,在on load事件中包含以下几行: string menuIDdata = Page.Request.QueryString["mid"]; menuID = 0; // Get the menu ID if (!int.TryParse(menuIDdata, out menuID)) { menuID = 0; } …