为什么System.Xml.XmlDocument上的XPath找不到相邻的文本和CData节点? - c#

为什么System.Xml.XmlDocument上的XPath找不到相邻的文本和CData节点?

var raw_xml = @"
<root>
    <test>
        <![CDATA[This is a CDATA node]]>And this is an adjacent text node
    </test>
</root>
";

var doc = new XmlDocument();
doc.LoadXml(raw_xml);

var results = doc.SelectNodes("/root/test/text()");
Console.WriteLine(results.Count); // gives: 1
Console.WriteLine(results[0].Value); // gives: This is a CDATA node
Console.WriteLine(results[0].Name); // gives: #cdata-section
Console.WriteLine(results[0].GetType().FullName); // gives: System.Xml.XmlCDataSection
Console.WriteLine(results[0].NextSibling.Name); // gives: #text
Console.WriteLine(results[0].NextSibling.Value.Trim()); // gives: And this is an adjacent text node

从上面我们可以看到,CDATA节点在下一个同级节点中具有文本节点,因此您会认为表达式/root/test/text()会找到它。

与XPath相同的结果:/root/test/node()

参考方案

使用XML文档时,您可能习惯于使用文档对象模型(DOM),其中CDATA节点与文本节点是分开的。 XPath数据模型将text()节点视为所有相邻CDATA和文本DOM节点的同级对象。

因此,尝试编写一个查询,该查询将使用不是相邻系列中第一个的特定DOM文本/ CDATA节点,例如:

var results = doc.SelectNodes("/root/test/text()[starts-with(., 'And')]");
Console.WriteLine(results.Count); // gives: 0

实际上,尝试通过其他XPath选择“文本” DOM节点意味着:

var results = doc.SelectNodes("/root/test/text()[contains(., 'text node')]");

将给出与OP中初始/root/test/text()查询相同的结果。

您将看到两种模型的混合-XPath查询的结果被转换回DOM节点;因此它为您提供了第一个text()节点,在本例中为CDATA节点。

如果确实需要在XPath中使用单独的文本节点和CDATA节点,则需要确保XML注释将源文档中的节点分开,如下所示:

<root>
    <test>
        <![CDATA[This is a CDATA node]]><!-- separator comment -->And this is an adjacent text node
    </test>
</root>

以便

var results = doc.SelectNodes("/root/test/text()");
Console.WriteLine(results.Count);

将给出2

JSE 1.8,沙箱Java Applet通过HTTPS加载,但使用HTTP检索了crossdomain.xml - java

嗨,所有Java / Applet专家,我偶然发现了最新的JDK构建(1.8.0_b26)中的一个有趣问题。当使用最新的JDK运行Sandbox Java Applet时,我们尝试在Java代码中使用不同的协议连接回服务器-我们使用WSS(安全的Websockets连接,我们使用第三方Websockets客户端Java库)代替原始的HTTPS。结果,JVM尝…

使用单词拆分字符串,但将单词保留在每个数组索引中 - java

以下代码, String string = "<xml attributes>some xml code</xml>" + "<xml attributes>some xml code</xml>" + "<xml attributes>some x…

xml.etree.ElementTree.ParseError —异常处理未捕获错误 - python

我尝试解析具有许多未定义实体的an xml document,这些实体在尝试运行代码时会导致ParseError,如下所示:import xml.etree.ElementTree as ET tree = ET.parse('cic.fam_lat.xml') root = tree.getroot() while True: try:…

Xaml中的XPath选择节点 - c#

我想匹配一个xaml文件中的节点,我的文件如下所示:一些Xaml(类似于xml)的输入:<SomeNode> <!-- this is root btw --> <!-- [...] --> <SomeNode.AnyProperty> <!-- [...] --> </SomeNode.An…

C#-文本框的XML子节点 - c#

我在将子节点文本放入c#的富文本框中时遇到麻烦。到目前为止,这是我尝试过的:这是XML文件:<DATA_LIST> <Customer> <Full_Name>TEST</Full_Name> <Total_Price>100</Total_Price> <Discounts>…