将 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的主要内容,如果未能解决你的问题,请参考以下文章
将 XDocument.Descendants 与合并运算符一起使用??和可为空的类型
如何将 XPath 与 XElement 或 LINQ 一起使用?
XmlDocument.selectNodes() and selectSingleNode()的xpath的学习资料
与具有多个文本子节点的节点一起使用时,XPath contains(text(),'some string') 不起作用