我正在使用libxml2流式阅读器,我无法阅读实体引用。当实体引用在元素内容中时,它被视为类型XML_READER_TYPE_ENTITY_REFERENCE
的节点,可以这样读取:
示例XML:
<p>Wikipedia® is a registered trademark</p>
示例C代码:
xmlTextReaderRead(reader);
if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ENTITY_REFERENCE)
{
const xmlChar *entityRef = xmlTextReaderConstName(reader);
///entityRef will be "reg"
}
读者会发出以下警告,但它对解析没有影响:
file://localhost/Volumes/Users/ben/testdata.html:1001: parser error : Entity 'reg' not defined
Wikipedia® is a registered trademark of the <a href="http://www.wikimediafou
^
当实体引用在属性中时,事情并不那么简单:
示例XML:
<img alt="random text containing ® entity reference" src="notImportant" />
我正在阅读这样的属性:
while (xmlTextReaderMoveToNextAttribute(self.reader) == 1)
{
const xmlChar *attribName = xmlTextReaderConstName(self.reader);
const xmlChar *attribValue = xmlTextReaderConstValue(self.reader);
//process the attribute
}
如果属性值包含实体引用attribValue
,则省略它,例如:
//attribValue = "random text containing entity reference"
如何检索属性值以使实体引用不丢失?
(我认为这样做的方法是读取属性值使用xmlReaderRead
,以便将该值视为XML_READER_TYPE_ENTITY_REFERENCE
和XML_READER_TYPE_TEXT
个节点,但我无法弄清楚怎么做。)