читатель libxml: как мне прочитать значение атрибута, чтобы сохранить ссылку на сущность - PullRequest
2 голосов
/ 14 апреля 2011

Я использую потоковый ридер libxml2 и у меня проблемы с чтением ссылок на сущности. Когда ссылка на сущность находится внутри содержимого элемента, она обрабатывается как узел типа XML_READER_TYPE_ENTITY_REFERENCE, который можно прочитать следующим образом:

Пример XML:

<p>Wikipedia&reg; 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&reg; is a registered trademark of the <a href="http://www.wikimediafou
              ^

Не все так просто, когда ссылка на сущность находится внутри атрибута:

Пример XML:

<img alt="random text containing &reg; 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 узлов, но я не могу понять, как это сделать.)

...