抵达片段
您目前得到的XML片段导致丢失的命名空间声明的方式。在你的片段中ns2
不再是一个前缀,你只需要一个带冒号的元素名称(ns2:Person
)。这会导致命名空间感知解析器出现问题。下面的文章可能是一个更好的办法,你得到的XML片段:
处理您的使用例
使用,你有XML片段,您可以创建一个XMLFilter
,它从XML元素中删除前缀,然后利用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;
}
你只发布一个XML标签......这真的是你的情况,即你要来解读眼前这个段(或者有一个完整的xml文档,应该有xmlns:ns2定义)? – Less 2012-08-15 11:28:46
你猜对了,只有这个片段是我想要的 – 2012-08-15 13:05:10