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