将 XPath 与 XDocument 一起使用时忽略 CData

Posted

技术标签:

【中文标题】将 XPath 与 XDocument 一起使用时忽略 CData【英文标题】:Ignore CData when using XPath with XDocument 【发布时间】:2021-06-17 03:20:24 【问题描述】:

我想从 XML 中提取数据并通过 XPath 将其转换为 DateTime。我有以下功能:

DateTime? GetXPathDate(string xPath, XDocument xDoc)

    DateTime? result = null;
    var element = xDoc.XPathSelectElement(xPath);
    return result;

我可以找到元素,但问题是它包含在 CData 中:

<CarName>
    <![CDATA[XXX Jan]]>
</CarName>

有没有办法通过 XDocument 忽略 CData 部分,或者我是否需要对自己进行正则表达式?

【问题讨论】:

您的示例不清楚 - 您已经显示了文档,但没有显示您希望找到数据的 xpath(或者甚至是您正在寻找的数据)。请提供一个更清晰、更完整的示例。 System.Xml.Linq 已经知道如何通过 XCData 使用 CDATA。你不需要正则表达式或任何东西。 要选择CData 文本值,请参阅How do I retrieve element text inside CDATA markup via XPath? 或How do i read individual xml nodes from a node that contains both CDATA and xml。这些能回答你的问题吗? 我尝试了 /Root/Car/CarName/text() 但有以下问题:XPath 表达式评估为意外类型 System.Xml.Linq.XCData。我看到了那个帖子,但没有成功。 我很少使用 XPath,但是当我只是模拟一个示例时,XElement 足够聪明,可以将 cdata 内容作为值提供。因此,如果您的 xpath 正确,您需要解析为日期的字符串就是 element.Value 【参考方案1】:

请尝试以下概念示例。

c#

void Main()

    string elementName = "CarName";
    
    XElement xelem = XElement.Parse("<CarName><![CDATA[XXX Jan]]></CarName>");
    
    XElement x = xelem.DescendantsAndSelf(elementName).FirstOrDefault();
    Console.WriteLine(x.Value);

输出

XXX Jan

【讨论】:

以上是关于将 XPath 与 XDocument 一起使用时忽略 CData的主要内容,如果未能解决你的问题,请参考以下文章

如何将 XPath 与没有前缀的默认命名空间一起使用?

将 XDocument.Descendants 与合并运算符一起使用??和可为空的类型

在 XDocument 中按名称查询任意深度的元素

如何将 XPath 与 XElement 或 LINQ 一起使用?

XmlDocument.selectNodes() and selectSingleNode()的xpath的学习资料

与具有多个文本子节点的节点一起使用时,XPath contains(text(),'some string') 不起作用