如何从 libxml2 中删除 '&'-words 编码?

How to remove '&'-words encoding from libxml2?

我有一个 XML 文件需要解析和处理。出于这个原因,我正在使用 libxml2.

我的 xml 文件看起来像这样:

test.xml

<root>
     <tag attr1="VALUE_1 &quot;" attr2="VALUE_2 &#xA; VALUE_3" />
</root>

我想获取属性内容。但是 libxml2 似乎对“&”字进行了编码(不知道如何称呼它们)。

我使用的代码如下:

LIBXML_TEST_VERSION

xmlDoc *doc;
doc = xmlReadFile("test.xml", NULL, XML_PARSE_IGNORE_ENC);

xmlNode *root;
root = xmlDocGetRootElement(doc);

xmlNode *node;
node = root->children;

while (node != NULL) {
        if (node->type == XML_ELEMENT_NODE) {

                xmlAttr *attr;
                attr = node->properties;

                while (attr != NULL) {
                        xmlNode *child;
                        child = attr->children;

                        while (child != NULL) {
                                if (child->type == XML_TEXT_NODE || 
                                    child->type == XML_CDATA_SECTION_NODE) 
                                        printf("%s\n", child->content);

                                child = child->next;
                        }

                        attr = attr->next;
                }
        }       

        node = node->next;
}

所以基本上我想打印属性值,但它们正在用格式解析(我猜)。当我 运行 此代码时,我看到以下输出:

VALUE_1 "

VALUE_2 
 VALUE_3

如您所见,它翻译了“&”字。我怎样才能提示 libxml2 不这样做并给我文字文本值。

你根本做不到。 libxml2 将始终解码数字字符引用,如 &#xA; 和预定义实体,如 &quot;。但是 &#65;A 在语义上是等价的。如果您真的需要区分它们,那么您可能在 XML 管道的其他地方做错了。如果您想在属性值中使用文字 &#xA;,则必须将其编码为 &amp;#xA;.

请注意,可以通过 XML_PARSE_NOENT 解析器标志控制其他用户定义实体的扩展,但这不会影响数字字符引用。