首页 > 解决方案 > XPath 在 c# 中返回 null 但在 XPath 验证器中有效

问题描述

这是我第一次使用 XPath。

这是我的 XML:

<content type="application/xml">
    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
        <d:Guid>YOIYOI-HNON-OIN</d:Guid>
        <d:ObjectId>6000009251</d:ObjectId>
        <d:ProcessType>ZMIN</d:ProcessType>
        <d:ProcessTypeTxt>Incident</d:ProcessTypeTxt>
        <d:Description>Test 2</d:Description>
        <d:IntroText>Incident</d:IntroText>
        <d:CreatedAtDateFormatted>08.05.18</d:CreatedAtDateFormatted>
        <d:ChangedAtDateFormatted>08.05.18</d:ChangedAtDateFormatted>
        <d:PostingDate>2018-05-08T00:00:00</d:PostingDate>
        <d:ChangedAtDate>2018-05-08T00:00:00</d:ChangedAtDate>
        <d:Priority>2</d:Priority>
        <d:PriorityTxt>2: High</d:PriorityTxt>
        <d:PriorityState>None</d:PriorityState>
        <d:Concatstatuser>New</d:Concatstatuser>
        <d:ActionRequired>false</d:ActionRequired>
        <d:StillOpen>true</d:StillOpen>
        <d:Icon></d:Icon>
        <d:SoldToPartyName></d:SoldToPartyName>
        <d:ServiceTeamName></d:ServiceTeamName>
        <d:PersonRespName></d:PersonRespName>
        <d:ConfigItemTxt></d:ConfigItemTxt>
    </m:properties>
</content>

还有其他内容节点。

我需要检索特定的标签值,例如:

但我不需要所有的标签值。

我尝试了一个在线 Xpath 验证器,我在其中发布了我的 XML 并使用了这个表达式:

//content/m:properties/d:Guid | //content/m:properties/d:ObjectId

这给了我需要的数据,但是当我在 c# 应用程序中使用它时,它返回 null。有人可以向我解释为什么会这样吗?除了使用 XPath 之外,是否还有其他方法可以做到这一点?

这是我的 C# 代码:

string xml = System.IO.File.ReadAllText(startupPath);
StringBuilder sb = new StringBuilder();

using (var node = ChoXmlReader.LoadText(xml).WithXPath("//content/m:properties/d:Guid or //content/m:properties/d:ObjectId"))
{
    using (var w = new ChoCSVWriter(sb).WithFirstLineHeader())
    {
        w.Write(node);
    }
}

Console.WriteLine(sb.ToString());
Console.ReadLine();

标签: c#validationxpathchoetl

解决方案


在您使用的在线验证器中,|但您or在代码中使用。ChoETL 真的改变了 XPath 的工作方式吗?我在文档中找不到这方面的证据。

另外,我认为在线工具会自动推断命名空间前缀,但您需要告诉 ChoETL 命名空间:

.WithXNamespace("d", "http://schemas.microsoft.com/ado/2007/08/dataservices")

和类似的。


推荐阅读