2015-11-24 5 views
0

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

<tags>Research skills, Searching&#44; evaluating and referencing</tags> 

Проблема в том, что один из этих «тегов» содержит в себе запятую. Запятая в теге закодирована, но запятые, предназначенные для разметки тегов, не являются. Я (в настоящее время) использую getText() method on org.dom4j.Node для чтения текстового содержимого элемента <tags>, который возвращает строку.

Проблема в том, что я не могу - насколько я знаю, - различать закодированную запятую (из тех, которые не закодированы) в получаемой мной строке.

Короткая запись собственного анализатора XML, есть ли другой способ доступа к текстовому контенту этого узла в более «сыром» состоянии? (То есть состояние, в котором закодирована запятая еще закодирован.)

+0

Проблема также возникает в контексте обработки XSLT, там вы можете использовать «LexEv» от Andrew Welch (http://andrewjwelch.com/lexev/) вместо обычного XMLReader ', он преобразует лексические события, включая ссылки на символы, в разметку соответственно узлов (например, ссылка на символ'   'сообщается как' '). Возможно, вы захотите попробовать, может ли он использоваться вместе с вашим DOM API. –

+0

@Martin, вы уверены, что LexEv сообщит о ссылках на символы? Я не думал, что эта информация доступна на уровне SAX.Я знаю, что он сообщает обрабатываемые сущности ссылки, но это другое дело. –

+0

Когда я написал свой комментарий, я опирался на документацию, но теперь я попытался запустить Saxon 9 вместе с LexEx и преобразованием идентичности в примере выше в вопросе, и он выдает корневой элемент как ' навыки поиска, поиск , оценка и ссылка ', так что да, он в состоянии идентифицируйте ссылки на символы, даже если обычные события SAX не покрывают их. Мне также нужно было положить 'xercesImpl.jar' в путь класса. –

ответ

1

При использовании dom4j или DOM все объекты уже решены, так что вам нужно будет вернуться к шагу разбора поймать символьные ссылки.

SAX - это более низкоуровневый интерфейс и имеет поддержку через интерфейс LexicalHandler, чтобы получать уведомление, когда парсер сталкивается с ссылками на сущности, но не сообщает о ссылках на символы. Похоже, вам действительно нужно написать собственный парсер или исправить существующий.

Но в конце концов, было бы лучше, если вы можете изменить схему документа:

<tags> 
    <tag>Research skills</tag> 
    <tag>Searching, evaluating and referencing</tag> 
</tags> 

В текущих ссылках ваших документов символов используются в качестве метаданных. XML-элементы - лучший способ выразить это.

+0

Согласен - представление этой информации в документе необходимо изменить. Как это часто бывает, я просил об этом изменении в течение некоторого времени ... и до сих пор этого не произошло. –

+0

В создании XML-представлений информации сделано много ошибок, но я должен сказать, что я впервые увидел, что кто-то пытается использовать разницу между буквальным символом и его шестнадцатеричным кодом как семантически значимое различие. –

1

Использование LexEv из http://andrewjwelch.com/lexev/, положив xercesImpl.jar от Apache Xerces на пути к классу, я могу скомпилировать и запустить какой-то короткий образец с использованием dom4j:

LexEv lexEv = new LexEv(); 

    SAXReader reader = new SAXReader(lexEv); 

    Document doc = reader.read("input1.xml"); 

    System.out.println(doc.getRootElement().asXML()); 

Если input1.xml имеет свой образец XML фрагмент кода, то выход

<tags xmlns:lexev="http://andrewjwelch.com/lexev">Research skills, Searching<lexev:char-ref name="#44">,</lexev:char-ref> evaluating and referencing</tags> 

Так что, как вы могли бы получить представление о вашем входе, где чистый символ и опорный символ можно отличить.

0

Насколько я знаю, каждый рамки обработки XML (кроме vtd-xml) разрешать объекты во время разбора ....

можно различить только символ из его сущности, закодированного с использованием аналога ВТД-XML с помощью toRawString VTDNav (в) метод ...