Я использую потоковый ридер 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
узлов, но я не могу понять, как это сделать.)