libxml reader: Как мне прочитать значение атрибута таким образом, чтобы ссылки на объекты были сохранены?

#c #xml #libxml2

#c #xml #libxml2

Вопрос:

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

Пример XML:

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

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

Пример XML:

 <img alt="random text containing amp;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"
  

Как мне получить значение атрибута таким образом, чтобы ссылка на объект не была потеряна?

(Я думаю, что способ сделать это — прочитать значение атрибута use xmlReaderRead , чтобы значение обрабатывалось как XML_READER_TYPE_ENTITY_REFERENCE и XML_READER_TYPE_TEXT узлы, но я не могу понять, как это сделать.)