How should text nodes with CDATA and spaces in XML be interpreted?

The System.Xml parsing features had a few surprises for me in the store, and I am wondering how to interpret the following, or if it is “before implementation”:

Version 1 :

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

Version 2:

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

What should be the meaning elem? Or is it normal that it depends on the implementation that parses it, and should I just handle it?

I expected (at first) that in both cases, all spaces between the start / end of the node and the first non-space character will be ignored. This is not so, but otherwise I would at least expect it to never be ignored, but it is not so either. See the full list below for my expectations.


To develop ...

, :

  • XDocument.Parse \n\t 2, 1.
  • XDocument.Load new XmlReaderSettings {IgnoreWhitespace = true} .

? ( ) , / ?

( # NUnit NuGet):

[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"));
    }
}
+4
1

CDATA . (). ]]>. XML (write).

elem . elem 3 .

  • node <\n\t "
  • cdata node "MyValue"
  • node <\n "

, , cdata. ( ).

  • node "\n\t-"
  • cdata node "MyValue"
  • node "-\n"

node (-). .

+2

All Articles