在 XML 中应如何解释带有 CDATA 和空格的文本节点?

2024-01-11

System.Xml 解析功能给我带来了一些惊喜,我想知道以下内容如何should被解释,或者如果这是“取决于实现”:

版本1:

<root><elem>
    <![CDATA[MyValue]]>
</elem></root>

版本2:

<root><elem>
    -<![CDATA[MyValue]]>-
</elem></root>

What should是 的值elem?或者这取决于解析它的实现,我应该处理这个问题吗?

我期望(首先)在这两种情况下,开始/结束节点和第一个非空白字符之间的所有空白都将被忽略。事实并非如此,但如果不是这样,我至少会期望它never被忽略,但事实也并非如此。请参阅下面的完整重现以了解我的期望。


详细说明...

当我测试它们时,有两个案例让我难住了:

  • XDocument.Parse会突然开始包括\n\t示例 2 中的空格,而示例 1 中的空格则被忽略。
  • XDocument.Load with new XmlReaderSettings {IgnoreWhitespace = true}会有类似的行为。

是什么赋予了?这只是(根据我的口味)古怪的实现,和/还是这是指定的行为?

这是我的期望的完整重现(带有来自 NuGet 的最新 NUnit 包的新 C# 类库项目):

[TestFixture]
public class XmlTests
{
    public static XDocument ParseDocument(string input)
    {
        return XDocument.Parse(input);
    }

    public static XDocument LoadDocument(Stream stream)
    {
        var xmlReader = XmlReader.Create(stream, new XmlReaderSettings() { IgnoreWhitespace = false }); // Default
        return XDocument.Load(xmlReader);
    }

    public static XDocument LoadDocument_IgnoreWhitespace(Stream stream)
    {
        var xmlReader = XmlReader.Create(stream, new XmlReaderSettings() { IgnoreWhitespace = true });
        return XDocument.Load(xmlReader);
    }

    const string example1 = "<root><elem>\n\t<![CDATA[MyValue]]>\n</elem></root>";
    const string example2 = "<root><elem>\n\t-<![CDATA[MyValue]]>-\n</elem></root>";

    [Test]
    public void A_Parsing_Example1_WorksAsExpected()
    {
        var doc = ParseDocument(example1);
        var element = doc.Descendants("elem").Single();
        Assert.That(element.Value, Is.EqualTo("MyValue"));
    }

    [Test]
    public void B_Loading_Example1_WorksAsExpected()
    {
        var doc = LoadDocument(new MemoryStream(Encoding.UTF8.GetBytes(example1)));
        var element = doc.Descendants("elem").Single();
        Assert.That(element.Value, Is.EqualTo("\n\tMyValue\n"));
    }

    [Test]
    public void C_LoadingWithIgnoreWhitespace_Example1_WorksAsExpected()
    {
        var doc = LoadDocument_IgnoreWhitespace(new MemoryStream(Encoding.UTF8.GetBytes(example1)));
        var element = doc.Descendants("elem").Single();
        Assert.That(element.Value, Is.EqualTo("MyValue"));
    }

    [Test]
    public void D_Parsing_Example2_WorksAsExpected()
    {
        var doc = ParseDocument(example2);
        var element = doc.Descendants("elem").Single();
        Assert.That(element.Value, Is.EqualTo("-MyValue-"));
    }

    [Test]
    public void E_Loading_Example2_WorksAsExpected()
    {
        var doc = LoadDocument(new MemoryStream(Encoding.UTF8.GetBytes(example2)));
        var element = doc.Descendants("elem").Single();
        Assert.That(element.Value, Is.EqualTo("\n\t-MyValue-\n"));
    }

    [Test]
    public void F_LoadingWithIgnoreWhitespace_Example2_WorksAsExpected()
    {
        var doc = LoadDocument_IgnoreWhitespace(new MemoryStream(Encoding.UTF8.GetBytes(example2)));
        var element = doc.Descendants("elem").Single();
        Assert.That(element.Value, Is.EqualTo("MyValue"));
    }
}

CDATA 很困难。它们不会被解析器更改(读取)。不允许包含无效字符或]]>。然而,某些实现会更改它们以生成有效的 XML 输出(写入)。

内容为elem取决于解析器以及它是否忽略空白节点。elem有3个子节点。

  1. 空白文本节点,内容为“\n\t"
  2. cdata 节节点内容为“MyValue"
  3. 空白文本节点,内容为“\n"

正如您所注意到的,如果忽略空白节点,则仅保留 cdata。在第二个示例中,结果会有所不同(如果已修复)。

  1. 带有内容的文本节点“\n\t-"
  2. cdata 节节点内容为“MyValue"
  3. 带有内容的文本节点“-\n"

第一个和第三个节点现在具有非空白内容(-)。它们不再是空白节点,并且根据选项不会被忽略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 XML 中应如何解释带有 CDATA 和空格的文本节点? 的相关文章

随机推荐

  • 如何使用 mongoimport 导入 json 文件

    我正在尝试使用导入 json 文件mongoimport使用此命令行 mongoimport db posts collection rows file post history json 但它返回此错误 connected to loca
  • 在同一查询中使用 DISTINCT 和 TOP

    我想用DISTINCT and TOP在同一个查询中 我试过 SELECT DISTINCT TOP 10 FROM TableA 但我还有一个副本personID 所以我想这样做 SELECT DISTINCT personID TOP
  • UIPickerView 最佳实践?

    一个简短的问题 在注册过程中 我想要求用户从值列表中选择一个值 使用视图控制器添加所有文本字段并为值添加选择器视图是正确的方法吗 由于选择器视图在文本字段区域之间需要如此多的空间 我想知道在这种情况下的最佳实践是什么 到目前为止 这是我的代
  • 使用可选的非默认参数以编程方式创建 R 函数

    继从如何以编程方式创建 R 函数 https stackoverflow com questions 12982528 how to create an r function programmatically 我想从它们的组件构建 R 函数
  • 响应式图像如何与“尺寸”中提供的长度“em”一起使用?

    浏览器如何理解em在响应式图像中使用时的单位 img alt A giraffe src giraffe jpg 这是有效的 并且我没有在浏览器控制台中看到警告 但如果图像预加载器的全部目的是获取图像beforeCSS被下载并解析 浏览器用
  • android BluetoothChat 使用来自另一个类的发送接收方法

    您好 我使用 BluetoothChat 示例来与 arduino 进行通信 到目前为止 一切正常 现在我想访问 sendMessage 方法 以便能够不从主类发送数据 而是从我创建的另一个类发送数据 这是BluetoothChat jav
  • Go语言中比较数组

    如何正确比较 Go 中的两个数组 例如 如何将二维数组与int条目 或任何其他类型 这种比较有多深 要比较两个数组 请使用比较运算符 http golang org ref spec Comparison operators or 引用自链
  • 我应该注入执行算法所需的对象吗?我应该注射所有东西吗?

    也许我在文档中错过了它 但我想知道应该如何处理 帮助对象 代码示例 public Path dijkstra Node startNode Node endNode Set
  • 哪种性能最好:使用 XPath 的 XPathNavigator 与使用查询的 Linq to Xml?

    我有一个应用程序 在其中使用 XPathNavigator 来迭代节点 它运行良好 但我想知道如果我使用 LINQ to Xml 我将获得什么好处 性能 可维护性 使用 XPath LINQ to Xml 对性能有何影响 我正在使用 C n
  • 将静态 IP 地址与 Amazon EC2 结合使用

    我想将 Amazon Web Service 免费微实例用于我的不同项目以进行测试和个人目的 但我需要一些静态公共 IP 来运行我的服务器 那可能吗 我可以从哪里购买 IP 并将其与我的 AWS 一起使用 EC2 弹性 IP 地址 http
  • ActiveAdmin不会保存有很多并且属于很多字段

    我有 2 个型号 类别和帖子 它们使用 has many and belongs to many 关系进行连接 我检查了 Rails 控制台 关系正常 我在 activeadmin 中创建了复选框来使用此表单字段设置帖子类别 f input
  • 为什么 %prec 在此 bison 语法中不起作用?

    考虑以下 Bison 语法 这是从我正在研究的一个更大的语法中剥离出来的 token ident left left CALLPREC start add expr ident call add call expr prec CALLPRE
  • 在 Mono 上使用自定义 SSL 客户端证书 System.Net.HttpClient

    我在用着Microsoft HTTP 客户端库 https www nuget org packages Microsoft Net Http来自 NuGet 我基本上尝试使用 X509Certificate2 证书在 HttpClient
  • lambda 内隐含的匿名类型

    In 这个问题 https stackoverflow com q 43973776 1876620 用户 Holger 提供一个答案 https stackoverflow com a 43983558 1876620这显示了我不知道的匿
  • 无法将导出用作类型,因为导出是一个值

    运行时出现此错误flow check 但我不确定这意味着什么 无法将导出用作类型 因为导出是一个值 要获取值的类型 请使用 typeof 错误位置是0 1 在 flow注释处 这是代码 flow import Chunk from mode
  • svn commit 不带-m

    我尝试过输入svn commit它将弹出一个屏幕 其中显示正在添加 更改 等的文件列表 以及在消息中输入的位置 但按 Enter 会在消息中添加换行符 而不是启动提交 是否有热键或某些组合键来启动提交 看起来底部有某种类似 emacs 的控
  • 如何以及在何处使用 AsyncStorage 保存整个 redux 存储

    我想知道是否必须执行类似的操作 才能在反应本机应用程序中使用 AsyncStorage 保存应用程序的整个存储 并在应用程序启动时检查它是否存在 var store loadInitialState async gt try var val
  • Vuetify 构建为 Web 组件样式未显示

    我正在使用 Vue 和 Vuetify 以及 Web 组件构建一个应用程序 当我将 Vuetify 添加为 Web 组件时 CSS 样式 Vuetify 消失了 我尝试将以下内容添加到 demo html 文件中但这没有帮助 我的仓库是vu
  • android listview半透明选择行的颜色

    我需要在列表视图中实现半透明的行选择 以及 按下 状态 如果我应用纯色 那么一切都会按预期进行 但如果我应用半透明颜色 44444444 那么我会看到默认选择颜色 在我的 2 3 android 上为橙色 在它的顶部是我的颜色 它使橙色稍微
  • 在 XML 中应如何解释带有 CDATA 和空格的文本节点?

    System Xml 解析功能给我带来了一些惊喜 我想知道以下内容如何should被解释 或者如果这是 取决于实现 版本1