Использование org.apache.commons.digester.Digester в XML с атрибутами - PullRequest
0 голосов
/ 26 февраля 2012

Я собираюсь извлечь значения из этого XML / RDF:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="urn:turismoculturale.itdc.filas-1.0.0-RC1#">
 <j.0:Chiesa rdf:ID="turismoCulturale_POI_880">
   <j.0:title xml:lang="en">Church of S. Giuda Taddeo or S. Onofrio - Gaeta</j.0:title>
   <j.0:title xml:lang="it">Chiesa S. Giuda Taddeo o S. Onofrio - Gaeta</j.0:title>
 </j.0:Chiesa>
</rdf:RDF>

Я хотел бы получить en title, когда я на языке "en", и "it" title в противном случае. Я могу установить значение заголовка в бобе Poi, используя:

Digester digester = new Digester();
digester.setNamespaceAware( true );
digester.setRuleNamespaceURI( "urn:turismoculturale.itdc.filas-1.0.0-RC1#" );
digester.addObjectCreate( "*/Chiesa",  Poi.class);
digester.addBeanPropertySetter("*/title", "title");
...

но я не знаю, английское или итальянское.

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Хорошо - в первую очередь, не пытайтесь анализировать RDF / XML с помощью синтаксического анализатора XML .Это никогда не сработает, потому что семантика XML-документа не имеет отношения к RDF / XML, и это плохая идея (если вы знаете, как работает RDF / XML), особенно в вашем случае, когда RDF / XML генерируется динамически(вы можете сказать по пространствам имен).Вам нужно использовать анализатор RDF для анализа RDF.

Так что это означает, что не используйте инструмент отображения объектов XML-Java, используйте инструмент отображения объектов RDF в Java.

Вот отличная ссылка, объясняющая, как это сделать:

И еще:

Вместе со ссылками на все инструменты в вышеупомянутом ресурсе:

Для анализатора RDF с расширением, обращайтесь к Jena:

Это проект Apache, которыйтакже приятно Maven'ed.

1 голос
/ 26 февраля 2012

Часто задаваемые вопросы Commons Digester говорят:

Иногда люди спрашивают, как они могут запустить правило для элемента на основе значения атрибута

Нет простого способа сделать это с Дигестером;встроенные механизмы сопоставления правил предоставляют возможность сопоставления только по имени элемента.Нет поддержки для выражений XPath

Возможно, будет возможно создать пользовательское правило «фильтрации», которое имеет дочернее правило и запускает это дочернее правило, только когда установлены соответствующие условия.Однако примеров такого решения не существует.

Дигестер не очень хороший инструмент.Это слишком упрощенно.Рассмотрите возможность использования более полного API, основанного на событиях, такого как StAX.

...