gpt4 book ai didi

namespaces - 如何使 JAXB 解码器忽略前缀?

转载 作者:行者123 更新时间:2023-12-02 14:46:19 24 4
gpt4 key购买 nike

我有以下 XML:

<ns2:Person name="John" age="20" />

我想将其解码到从 XSD 生成的 JAXB 对象 Person。

这是我正在运行的代码:

JAXBContext context = JAXBContext.newInstance(PersoEntity.class);
Unmarshaller um = context.createUnmarshaller();
StringReader sr = new StringReader(xml);
Person p = (Person)um.unmarshal(sr);

令人惊讶的是,我遇到了以下异常:

javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: The prefix "ns2" for element "ns2:Person" is not bound.]

如何解决?谢谢

最佳答案

获取片段

当前获取 XML 片段的方式会导致 namespace 声明丢失。在您的片段中,ns2 不再是前缀,您只有一个带有冒号的元素名称 (ns2:Person)。这将导致命名空间感知解析器出现问题。下面的文章可能是您获取 XML 片段的更好方法:

处理您的用例

使用您拥有的 XML 片段,您可以创建一个从 XML 元素中删除前缀的 XMLFilter,然后利用 JAXB 的 UnmarshallerHandler 进行解码。

演示

package forum11968399;

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.XMLFilterImpl;

public class Demo {

private static final String xml = "<ns2:Person name='John' age='20' />";

public static void main(String[] args) throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xmlReader = sp.getXMLReader();
XMLFilter xmlFilter = new MyXMLFilter(xmlReader);

JAXBContext context = JAXBContext.newInstance(PersonEntity.class);
Unmarshaller um = context.createUnmarshaller();
UnmarshallerHandler unmarshallerHandler = um.getUnmarshallerHandler();
xmlFilter.setContentHandler(unmarshallerHandler);

StringReader sr = new StringReader(xml);
xmlFilter.parse(new InputSource(sr));
PersonEntity p = (PersonEntity) unmarshallerHandler.getResult();
}

private static class MyXMLFilter extends XMLFilterImpl {

public MyXMLFilter(XMLReader xmlReader) {
super(xmlReader);
}

@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
int colonIndex = qName.indexOf(':');
if(colonIndex >= 0) {
qName = qName.substring(colonIndex + 1);
}
uri = XML_NAMESPACE; //to prevent unknown XML element exception, we have to specify the namespace here
super.startElement(uri, localName, qName, attributes);
}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
int colonIndex = qName.indexOf(':');
if(colonIndex >= 0) {
qName = qName.substring(colonIndex + 1);
}
super.endElement(uri, localName, qName);
}

}

}

PersonEntity

package forum11968399;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Person")
@XmlAccessorType(XmlAccessType.FIELD)
public class PersonEntity {

@XmlAttribute
private String name;

@XmlAttribute
private int age;

}

关于namespaces - 如何使 JAXB 解码器忽略前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11968399/

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