【问题标题】:Retrieve namespace value of XML using digester使用摘要器检索 XML 的命名空间值
【发布时间】:2015-12-31 20:24:53
【问题描述】:

我正在尝试从 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"/>

【问题讨论】:

    标签: java xml owl apache-commons-digester


    【解决方案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 属性),所以不会匹配简单的setter,你会得到类似“no such方法”在异常消息中。

    因此,如果您需要正文内容,请尝试添加另一个 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");
    

    如果这些都不起作用,您可以添加您正在使用的消化器版本的详细信息,以及您得到的异常。

    【讨论】:

    • 非常感谢。它工作得非常好。我已经尝试了第二个并且能够提取没有内容的“zlib.com#Ni_Hydro”。
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2023-03-31
    • 2010-09-12
    • 2021-11-02
    • 1970-01-01
    • 2023-04-07
    • 2015-02-21
    • 2020-03-18
    相关资源
    最近更新 更多