Java 使用jaxb解组xml文档的中间部分
我试图解开一个大xml文档的中间元素。目前正在使用JAXB和Woodstox 需要解组的xml中间元素示例:Java 使用jaxb解组xml文档的中间部分,java,xml,jaxb,Java,Xml,Jaxb,我试图解开一个大xml文档的中间元素。目前正在使用JAXB和Woodstox 需要解组的xml中间元素示例: <Values> <Person ID="ABC"> <FirstName>Shawn</FirstName> <LastName>Mark</LastName> <Age>3</Age> </Person> <Person ID="
<Values>
<Person ID="ABC">
<FirstName>Shawn</FirstName>
<LastName>Mark</LastName>
<Age>3</Age>
</Person>
<Person ID="DEF">
<FirstName>John</FirstName>
<LastName>Durell</LastName>
<Age>4</Age>
</Person>
</Values>
肖恩
做记号
3.
约翰
杜雷尔
4.
我使用的jaxb类是:
@XmlRootElement(name = "Values")
@XmlAccessorType(XmlAccessType.FIELD)
public class Attributes
{
@XmlElement(name = "Person")
private ArrayList<Person> persons;
public ArrayList<Person> getPersons()
{
return persons;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Person
{
@XmlAttribute
private String ID;
@XmlElement(name = "FirstName")
private String firstName;
@XmlElement(name = "LastName")
private String lastName;
@XmlElement(name = "Age")
private String age;
}
@XmlRootElement(name=“Values”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类属性
{
@xmlement(name=“Person”)
私人律师;
公共数组列表getPersons()
{
返回人员;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
公共阶层人士
{
@XmlAttribute
私有字符串ID;
@xmlement(name=“FirstName”)
私有字符串名;
@xmlement(name=“LastName”)
私有字符串lastName;
@xmlement(name=“Age”)
私弦时代;
}
我能够解组除ID以外的所有值。它显示为null
代码如下:
final XMLInputFactory xif = XMLInputFactory.newInstance();
final StreamSource xml = new StreamSource(pathToxmlFile);
XMLStreamReader xsr;
xsr = xif.createXMLStreamReader(xml);
xsr.nextTag();
while (!xsr.getLocalName().equals("Values"))
{
xsr.nextTag();
}
final JAXBContext jc = JAXBContext.newInstance(Attributes.class);
final Unmarshaller unmarshaller = jc.createUnmarshaller();
final JAXBElement<Attributes> jb = unmarshaller.unmarshal(xsr, Attributes.class);
final XMLInputFactory xif=XMLInputFactory.newInstance();
最终StreamSource xml=新的StreamSource(pathToxmlFile);
XMLStreamReader xsr;
xsr=xif.createXMLStreamReader(xml);
xsr.nextTag();
而(!xsr.getLocalName().equals(“值”))
{
xsr.nextTag();
}
final JAXBContext jc=JAXBContext.newInstance(Attributes.class);
final Unmarshaller Unmarshaller=jc.createUnmarshaller();
final-JAXBElement jb=unmarshaller.unmarshal(xsr,Attributes.class);
只有当
从根嵌套5-6层时,上述代码才起作用。如果
之前存在15个标记,则此代码无效
与仅使用JAXB和对所有元素进行解组相比,它的速度相对较慢,但这需要我为永远不会使用的数据创建对象
所以,我的问题是,有没有提高性能的方法?
当它嵌套在xml深处时,为什么不能工作?
如何从Person属性中获取ID值?以下内容应该会有所帮助:
当它嵌套在xml深处时,为什么不工作? 如果不工作意味着抛出异常,如:
Exception in thread "main" javax.xml.stream.XMLStreamException: ParseError at [row,col]:[4,13]
Message: found: CHARACTERS, expected START_ELEMENT or END_ELEMENT
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.nextTag(XMLStreamReaderImpl.java:1247)
at blog.stax.middle.UnmarshalDemo.main(UnmarshalDemo.java:15)
您可以将推进XmlStreamReader
的代码更改为:
while(xsr.hasNext()) {
if(xsr.isStartElement() && xsr.getLocalName().equals("Values")) {
break;
}
xsr.next();
}
是否有提高性能的方法? StAX是解析XML文档的一种非常快速的方法。无论如何,JAXB实现可能正在使用它。字符串比较可能很慢。 因为您使用的是Woodstox和it实习生元素名称(请参阅:第6.1节字符串实习生:)。您可以对字符串而不是equals方法执行标识检查
if(Boolean.TRUE.equals(xsr.getProperty("org.codehaus.stax2.internNames"))) {
while(xsr.hasNext()) {
if(xsr.isStartElement() && xsr.getLocalName() == "return") {
break;
}
xsr.next();
}
} else {
while(xsr.hasNext()) {
if(xsr.isStartElement() && xsr.getLocalName().equals("return")) {
break;
}
xsr.next();
}
}
如何从Person属性获取ID值? 默认情况下,JAXB(JSR-222)实现的XML将把
ID
字段映射到名为ID
的属性,而不是ID
。您可以按如下方式覆盖此默认值:
@XmlAttribute(name="ID")
private String ID;
是的,这确实有助于提高我的表现。但我还有一个问题,是否还有其他类/方法可以使用,这样我就可以将xml数据作为字符串传递给JAXB/Stax,而不是从文件中读取。@Ikshvak-您可以在
StringReader
的实例中包装xmlString
,并从中解包。JAXB支持许多不同类型的解组。