7

JAXB を使用して XML を解析しました。その要素をノードとして解析せずに、JAXB xml 解析を介して特定の要素 (つまり、子ノード) を取得する方法。

<?xml version="1.0" encoding="UTF-8"?>
        <Header>
            <From>
            <Credential
                        domain="NetworkId"><Identity>ANXXXNNN</Identity>
            </Credential>
            </From>

            <To>
            <Credential
                        domain="NetworkId"><Identity>ANNNXXXXXT</Identity>
            </Credential>
            </To>

            <To>
            <Credential
                        domain="NetworkId"><Identity>BNNXXXT</Identity>
            </Credential>
            </To>
        </Header>

このようにアンマーシャリングを行いましたが、正常に動作します.パフォーマンスのために、要素をノードとして使用したくありません.他の方法はありますか?

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc;
    doc = db.parse(file);
    NodeList node = (NodeList)doc.getElementsByTagName("TO");

   JAXBElement<ToType> element =  jaxbUnmarshaller.unmarshal(node.item(0),ToType.class);

オブジェクトモデルは

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ToType", propOrder = {
    "credential"
})
public class ToType {

    @XmlElement(name = "Credential", required = true)
    protected CredentialType credential;


    public CredentialType getCredential() {
        return credential;
    }

    public void setCredential(CredentialType value) {
        this.credential = value;
    }

}

4

2 に答える 2

7

StAX (JSR-173)パーサー (Java SE 6 以降の JDK/JRE に含まれる) を使用できます。次に、XMLStreamReaderを子ノードに進め、そこから非整列化できます。

import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource xml = new StreamSource("src/forum14358769/input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(xml);

        // Advance to the "To" element.
        while(xsr.hasNext()) {
            if(xsr.isStartElement() && "To".equals(xsr.getLocalName())) {
                break;
            }
            xsr.next();
         }

        // Unmarshal from the XMLStreamReader that has been advanced
        JAXBContext jc = JAXBContext.newInstance(ToType.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        ToType toType = unmarshaller.unmarshal(xsr, ToType.class).getValue();
    }

}

詳細については

于 2013-01-16T13:45:56.977 に答える
0

JAXB アンマーシャリングを実行するには、次のコードを実行する必要があります。

unmarshaler.unmarshal(source);

これにより、xjc コマンドを使用して生成したクラスのインスタンスが返されます。

その後、Bean メソッドを使用して任意のプロパティにアクセスできます。

于 2013-01-16T12:53:26.110 に答える