Получить значение пространства имен XML с помощью дайджеста

Я пытаюсь извлечь информацию из файла XML и могу извлечь значения без его свойств.

Код:

public class NRusEntity {
    private String code;
    private String name;
    private String saltForm;

    getters and setters
    ...

Класс парсера:

       ...
        String filePath = FileUtility.getOwlFilePath();                     
        try {
            Digester digester = new Digester();
            digester.setValidating(false);

            //digester.setNamespaceAware(true);

            digester.addObjectCreate("rdf:RDF", NRus.class);
            digester.addObjectCreate("rdf:RDF/owl:Class", NRusEntity.class);

            digester.addCallMethod("rdf:RDF/owl:Class/Preferred_Name", "setName", 0);
            digester.addCallMethod("rdf:RDF/owl:Class/code", "setCode", 0);

            /**This commented part creates exception*/ 

            //digester.addCallMethod("rdf:RDF/owl:Class/Has_Salt_Form", "setSaltForm", 2);
            //digester.addCallParam("rdf:RDF/owl:Class/Has_Salt_Form", 0);
            //digester.addCallParam("rdf:RDF/owl:Class/Has_Salt_Form", 1, "rdf:resource");


            digester.addSetNext("rdf:RDF/owl:Class", "addEntry");
            File input = new File(filePath);
            digester.parse(input);
        } 
        ...

XML выглядит так:

<?xml version="1.0"?>

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:owl="http://www.w3.org/2002/07/owl#">

    <owl:Class rdf:about="#z">
        <Preferred_Name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">von</Preferred_Name>
        <code rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XY221</code>
        <Has_Format rdf:resource="http://zlib.com#Ni_Hydro"/>
    </owl:Class>
    ...
</rdf:RDF>

Как я могу извлечь значение URI

"http://zlib.com#Ni_Hydro" 

из этой строки XML

<Has_Format rdf:resource="http://zlib.com#Ni_Hydro"/>

person fean    schedule 31.12.2015    source источник


Ответы (1)


Я не могу точно сказать, поскольку ваш XML не совсем соответствует вашему коду: закомментированный код относится к элементу Has_Salt_Form, но элемент rdf:resource появляется в элементе Has_Format. Тем не менее, я вижу одну потенциальную проблему, которая может помочь вам прогрессировать:

Я предполагаю, что ваш установщик класса NRusEntity выглядит примерно так:

public void setSaltForm(String saltForm) {
  // assign saltForm, or whatever...
}

Однако у вас есть код дайджеста:

digester.addCallMethod("rdf:RDF/owl:Class/Has_Salt_Form", "setSaltForm", 2);
digester.addCallParam("rdf:RDF/owl:Class/Has_Salt_Form", 0);
digester.addCallParam("rdf:RDF/owl:Class/Has_Salt_Form", 1, "rdf:resource");

Это ищет метод setSaltForm с двумя параметрами (первый — это тело элемента, второй — атрибут rdf:resource), поэтому он не будет соответствовать простому установщику, и вы получите что-то вроде «нет такого метода» в сообщении об исключении.

Поэтому, если вам нужно содержимое тела, попробуйте добавить еще один метод set:

public void setSaltForm(String content, String attrib) {
  // content will have the element content
  // attrib will have "http://zlib.com#Ni_Hydro"
}

Или, если вам не нужен контент, удалите его из правил дайджеста:

digester.addCallMethod("rdf:RDF/owl:Class/Has_Salt_Form", "setSaltForm", 1);
digester.addCallParam("rdf:RDF/owl:Class/Has_Salt_Form", 0, "rdf:resource");

Если ни одна из них не работает, вы не можете добавить информацию об используемой вами версии дайджеста и полученном исключении.

person Barney    schedule 01.01.2016
comment
Большое спасибо. Это работало абсолютно нормально. Я попытался со вторым и смог извлечь zlib.com#Ni_Hydro без содержимого. - person fean; 04.01.2016