大きな xml ドキュメントの中間要素を非整列化しようとしています。現在、JAXB と Woodstox を使用しています。
非整列化する必要がある xml 中間要素の例:
<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>
私が使用する 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;
}
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);
上記のコードは<Values>
、がルートから 5 ~ 6 レベルにネストされている場合にのみ機能します。の前に 15 個のタグが存在する場合<Values>
、このコードは機能していません。
また、JAXB のみを使用してすべての要素をアンマーシャリングする場合と比較すると、比較的非常に遅くなりますが、使用されることのないデータのオブジェクトを作成する必要があります。
だから、私の質問は - パフォーマンスを向上させる方法はありますか? xml の奥深くにネストされていると機能しないのはなぜですか? Person属性からID値を取得するには?