1

構造的に異なる 2 つの XML がある状況があります。これらからデータを抽出し (一度に XML のみを解析する必要があります)、いくつかのロジックに送信してから、共通の形式に入力する必要があります。

<xml1>
    <a>hello</a>
    <b>shreyas</b>
    <c>123</c>
</xml1>

<xml2>
    <d>
        <name>
            <my>hello</my>
        </name>
    </d>
    <e>shreyas</e>
    <f>124</f>
</xml2>

および入力する共通オブジェクト

public class Gobj {

    String fName;
    String lName;
    String id;
}

私はある種のランタイム注釈リゾルバーを探していました。Jaxb の上に Jboss によって実装された JaxbIntros を試しましたが、それに対する xpath サポートが見つかりませんでした。

また、この問題は基本的な SAX パーサーを使用して解決できますが、jaxb などの方法が必要でした。コードの可読性が容易になる場所。

-ありがとうShreyas

4

1 に答える 1

1

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

以下は、MOXy の外部マッピング ファイル拡張子を使用して、このユース ケースをサポートする方法です。

XML 1 のメタデータ

標準の JAXB アノテーションを使用して、Gobjクラスを最初の XML 表現にマップします。

package forum17652921;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="xml1")
@XmlAccessorType(XmlAccessType.FIELD)
public class Gobj {

    @XmlElement(name="a")
    String fName;

    @XmlElement(name="b")
    String lName;

    @XmlElement(name="c")
    String id;

}

XML 2 のメタデータ

MOXy の外部マッピング ドキュメントを使用して、同じクラスを 2 番目の XML 表現にマップします。デフォルトでは、マッピング ドキュメントは、アノテーションによって提供されるメタデータを補強するために使用されます。xml-metadata-completeflag を trueに設定すると、そのメタデータを完全に置き換えることができます。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum17652921"
    xml-accessor-type="FIELD"
    xml-mapping-metadata-complete="true">
    <java-types>
        <java-type name="Gobj">
            <xml-root-element name="xml2"/>
            <java-attributes>
                <xml-element java-attribute="fName" xml-path="d/name/my/text()"/>
                <xml-element java-attribute="lName" name="e"/>
                <xml-element java-attribute="id" name="f"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

デモ

以下のデモ コードには、 の 2 つのインスタンスがありJAXBContextます。最初の を使用して、XML 表現 1 を のインスタンスに読み込みますGobj。次に、2 番目を使用してJAXBContext、同じインスタンスをGobj2 番目の XML 表現にマーシャリングします。

package forum17652921;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc1 = JAXBContext.newInstance(Gobj.class);

        Unmarshaller unmarshaller = jc1.createUnmarshaller();
        File xml = new File("src/forum17652921/xml1.xml");
        Gobj gobj = (Gobj) unmarshaller.unmarshal(xml);

        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum17652921/oxm.xml");
        JAXBContext jc2 = JAXBContext.newInstance(new Class[] {Gobj.class}, properties);

        Marshaller marshaller = jc2.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(gobj, System.out);
    }

}

xml1.xml

<xml1>
    <a>hello</a>
    <b>shreyas</b>
    <c>123</c>
</xml1>

出力

<?xml version="1.0" encoding="UTF-8"?>
<xml2>
   <d>
      <name>
         <my>hello</my>
      </name>
   </d>
   <e>shreyas</e>
   <f>123</f>
</xml2>

詳細については

于 2013-07-15T20:53:47.810 に答える