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