Использование org.apache.commons.digester.Digester в XML с атрибутами
Я собираюсь извлечь значения из этого 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 ответа
Хорошо - прежде всего, не пытайтесь анализировать RDF/XML с помощью анализатора XML. Это никогда не сработает, потому что семантика XML-документа не имеет отношения к RDF/XML, и это плохая идея (если вы знаете, как работает RDF/XML), особенно в вашем случае, когда RDF/XML генерируется динамически (вы можете сказать по пространствам имен). Вам нужно использовать анализатор RDF для анализа RDF.
Таким образом, это означает, что не используйте инструмент отображения объектов XML на Java, используйте инструмент отображения объектов RDF на Java.
Вот отличная ссылка, объясняющая, как это сделать:
И другой:
Вместе со ссылками на все инструменты в вышеупомянутом ресурсе:
Для полного разбора RDF посмотрите на Jena:
Это проект Apache, который также хорошо разработан Maven.
Часто задаваемые вопросы Commons Digester гласят:
Иногда люди спрашивают, как они могут запустить правило для элемента, основанного на значении атрибута
Нет простого способа сделать это с Дигестером; встроенные механизмы сопоставления правил предоставляют возможность сопоставления только по имени элемента. Нет поддержки для выражений XPath
Может быть возможно создать пользовательское правило "фильтрации", которое имеет дочернее правило и запускает это дочернее правило, только когда установлены соответствующие условия. Однако нет примеров такого решения.
Дигестер не очень хороший инструмент. Это слишком упрощенно. Подумайте об использовании более полного API, основанного на событиях, такого как StAX.