7

次のxml文字列があります。各タグをそのオブジェクトのフィールドにマップするために、それをJavaオブジェクトに変換したいと思います。タグ名とは異なるフィールド名を導入できれば良いのですが。どうすればそれができますか?JAXB を調べていますが、「ns4:response」などの部分やタグ内のタグについてまだ混乱しています。前もって感謝します...

<ns4:response>
    <count>1</count>
    <limit>1</limit>
    <offset>1</offset>
    <ns3:payload xsi:type="productsPayload">
        <products>
            <product>
                <avgRating xsi:nil="true"/>
                <brand>Candie's</brand>
                <description>
                    <longDescription>
                    long descriptions
                    </longDescription>
                    <shortDescription>
                    short description
                    </shortDescription>
                </description>
                <images>
                    <image>
                        <altText>alternate text</altText>
                        <height>180.0</height>
                        <url>
                        url
                        </url>
                        <width>180.0</width>
                    </image>
                </images>
                <price>
                    <clearancePrice xsi:nil="true"/>
                    <regularPrice xsi:nil="true"/>
                    <salePrice>28.0</salePrice>
                </price>
            </product>
        </products>
    </ns3:payload>
</ns4:response>
4

4 に答える 4

27

JAXBは、オブジェクトをXMLとの間で変換するためのJava標準( JSR-222 )です。以下が役立つはずです:

文字列からのアンマーシャリング

JAXB implがそれをアンマーシャリングする前にString、のインスタンスでラップする必要があります。StringReader

StringReader sr = new StringReader(xmlString);
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Response response = (Response) unmarshaller.unmarshal(sr);

異なるフィールド名とXML名

@XmlElement注釈を使用して、要素の名前を指定できます。デフォルトでは、JAXBはプロパティを調べます。フィールドに基づいてマッピングを行う場合は、を設定する必要があります@XmlAccessorType(XmlAccessType.FIELD)

@XmlElement(name="count")
private int size;

名前空間

@XmlRootElementandアノテーションを使用する@XmlElementと、必要に応じて名前空間の修飾を指定することもできます。

@XmlRootElement(namespace="http://www.example.com")
public class Response {
}

詳細については

于 2012-08-10T11:20:57.367 に答える
2

JAXBは良いショットです。このドキュメントのXSDファイルがある場合、これは非常に簡単です。JAXBは、指定されたスキーマのJavaコードを生成できます。XSDファイルがない場合は、自分でJavaクラスを準備する必要があります。JAXBチュートリアルを探し、ドキュメントhttp://jaxb.java.net/tutorial/を確認してください。タグ内のタグは、JAXBのネストされたオブジェクトにすぎません。ns4名前空間です。JAXBは名前空間をサポートしています-ドキュメントで調べてください。注釈を使用して、XMLのタグとは異なるフィールド名を導入できます。ドキュメントをフォローします。

于 2012-08-10T08:06:08.907 に答える
1

上記のXMLのXSDがある場合。
Jaxbの使用をお勧めします。
JAXBは、XMLファイルからJavaオブジェクトを作成します。最初に、入力としてXSDを受け取るjaxbのコードジェネレーターを使用してJavaクラスを生成し、次にこれらのxmlファイルを適切にシリアル化/逆シリアル化する必要があります。

于 2012-08-10T07:58:31.363 に答える
1

xml が既にあり、複数の属性がある場合は、次のように処理できます。

    String output = "<ciudads><ciudad><idCiudad>1</idCiudad>
    <nomCiudad>BOGOTA</nomCiudad></ciudad><ciudad><idCiudad>6</idCiudad>
    <nomCiudad>Pereira</nomCiudad></ciudads>";
    DocumentBuilder db = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(output));

    Document doc = db.parse(is);
    NodeList nodes = ((org.w3c.dom.Document) doc)
        .getElementsByTagName("ciudad");

    for (int i = 0; i < nodes.getLength(); i++) {           
        Ciudad ciudad = new Ciudad();
        Element element = (Element) nodes.item(i);

        NodeList name = element.getElementsByTagName("idCiudad");
        Element element2 = (Element) name.item(0);
        ciudad.setIdCiudad(Integer
            .valueOf(getCharacterDataFromElement(element2)));

        NodeList title = element.getElementsByTagName("nomCiudad");
        element2 = (Element) title.item(0);
        ciudad.setNombre(getCharacterDataFromElement(element2));

        ciudades.getPartnerAccount().add(ciudad);
    }
    }

    for (Ciudad ciudad1 : ciudades.getPartnerAccount()) {
    System.out.println(ciudad1.getIdCiudad());
    System.out.println(ciudad1.getNombre());
    }

メソッド getCharacterDataFromElement は

    public static String getCharacterDataFromElement(Element e) {
    Node child = e.getFirstChild();
    if (child instanceof CharacterData) {
    CharacterData cd = (CharacterData) child;

    return cd.getData();
    }
    return "";
    }
于 2016-12-09T16:34:38.420 に答える