gpt4 book ai didi

java - 使用消化器检索 XML 的命名空间值

转载 作者:行者123 更新时间:2023-12-01 10:38:29 25 4
gpt4 key购买 nike

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

最佳答案

我无法准确判断,因为您的 XML 似乎与您的代码不太匹配:注释掉的代码引用了 Has_Salt_Form 元素,但引用了 rdf:resource 元素出现在 Has_Format 元素上。但是,我可以看到一个可能有助于您进步的潜在问题:

我假设您的 NRusEntity 类 setter 类似于:

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,你会在异常消息中得到类似“没有这样的方法”的信息。

因此,如果您需要正文内容,请尝试添加另一个设置方法:

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");

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

关于java - 使用消化器检索 XML 的命名空间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34551326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com