你能保留XML中的前导和尾随空格吗?

时间:2009-01-05 21:46:17

标签: xml parsing whitespace

如何告诉XML解析器尊重前导空格和尾随空格?

Dim xml: Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml>1 2</xml>"
wscript.echo len(xml.documentelement.text)

以上打印出3。

Dim xml: Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml> 2</xml>"
wscript.echo len(xml.documentelement.text)

上面打印出1.(我想要打印2)。

我是否可以在xml文档中放入一些特殊内容来告诉解析器在文档中保留前导空格和尾随空格?

澄清1 :是否有一个属性可以在文档开头指定ONCE以应用于所有元素?

澄清2 :因为实体的内容可能有unicode数据,但xml文件需要是简单的ascii,所有实体都是编码的 - 这意味着CDATA不可用。

3 个答案:

答案 0 :(得分:8)

正如我评论的那样,建议使用xml:space="preserve"的所有答案都是错误的

xml:space属性只能用于控制空白节点的处理,即完全空格字符的文本节点。

目前的问题并非如此。

实际上,下面提供的代码正确地获得了包含在

中的文本节点的长度2
<xml> 2</xml>

这是正确获取文本节点长度的VB代码(不要忘记添加对“Microsoft XML,v 3.0”的引用):

Dim xml As MSXML2.DOMDocument
Private Sub Form_Load()
Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml> 2</xml>"
Dim n
n = Len(xml.documentelement.selectSingleNode("text()").nodeValue)
wscript.echo Len(n)
End Sub

如果您在该行上设置断点:

wscript.echo Len(n)

你会看到当调试器在那里中断时,n的值是2,因为它是必需的。

因此,此代码是正在寻求的解决方案

答案 1 :(得分:3)

您可以尝试将其放入CDATA块中:

<xml><![CDATA[ 2]]></xml>

答案 2 :(得分:3)

正如Dimitre Novatchev所提到的,对于XML,空格不会被删除 随意解析器。白色空间是节点的一部分 值。由于我不会说Visual Basic,这里有一个C程序 libxml打印第一个文本节点的长度。有 绝对不需要设置xml:space。

% ./whitespace "<foo> </foo>"
Length of " " is 1

% ./whitespace "<foo> 2</foo>"
Length of " 2" is 2

% ./whitespace "<foo>1 2</foo>" 
Length of "1 2" is 3

以下是该计划:

#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>

int
main(int argc, char **argv)
{
    char           *xml;
    xmlDoc         *doc;
    xmlNode        *first_child, *node;
    if (argc < 2) {
        fprintf(stderr, "Usage: %s XML-string\n", argv[0]);
        return 1;
    }
    xml = argv[1];
    doc = xmlReadMemory(xml, strlen(xml), "my data", NULL, 0);
    first_child = doc->children;
    first_child = first_child->children;        /* Skip the root */
    for (node = first_child; node; node = node->next) {
        if (node->type == XML_TEXT_NODE) {
            fprintf(stdout, "Length of \"%s\" is %i\n", (char *) node->content,
                    strlen((char *) node->content));
        }
    }
    return 0;
}