如何从 libxml2 中删除 '&'-words 编码?
How to remove '&'-words encoding from libxml2?
我有一个 XML 文件需要解析和处理。出于这个原因,我正在使用 libxml2
.
我的 xml 文件看起来像这样:
test.xml
<root>
<tag attr1="VALUE_1 "" attr2="VALUE_2 
 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 将始终解码数字字符引用,如 

和预定义实体,如 "
。但是 A
和 A
在语义上是等价的。如果您真的需要区分它们,那么您可能在 XML 管道的其他地方做错了。如果您想在属性值中使用文字 

,则必须将其编码为 &#xA;
.
请注意,可以通过 XML_PARSE_NOENT
解析器标志控制其他用户定义实体的扩展,但这不会影响数字字符引用。
我有一个 XML 文件需要解析和处理。出于这个原因,我正在使用 libxml2
.
我的 xml 文件看起来像这样:
test.xml
<root>
<tag attr1="VALUE_1 "" attr2="VALUE_2 
 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 将始终解码数字字符引用,如 

和预定义实体,如 "
。但是 A
和 A
在语义上是等价的。如果您真的需要区分它们,那么您可能在 XML 管道的其他地方做错了。如果您想在属性值中使用文字 

,则必须将其编码为 &#xA;
.
请注意,可以通过 XML_PARSE_NOENT
解析器标志控制其他用户定义实体的扩展,但这不会影响数字字符引用。