2

論理演算子はEclipseLink MOXyのXmlPath注釈で機能しますか? 私は試してみましたが、うまくいきませんでした(例外はスローされず、「要素」には何もバインドされていません)。

たとえば、次のようなバインディング ファイルを作成したいと考えています。

    <java-type name="Content">
        <java-attributes>
           <xml-element java-attribute="elements" xml-path="/a/b/ | /c/d" 
            type="ElementType" container-type="java.util.List" />
        </java-attributes>
    </java-type>

論理パスまたは xml-path を使用せずにバインディングを変更して同じ結果を得る方法はありますか?

/a/bドメイン モデルでゲッターと設定を使用し、 と の両方を/c/d要素にバインドし、setElements() への呼び出しごとにリストを置き換えるのではなく、セッターに要素をリストに追加させる回避策しか考えられません。ただし、バインディングファイルで処理したいと思います。

XPath のどの部分が MOXy でサポートされているかを指定する場所がドキュメントに存在しますか?

4

1 に答える 1

2

このユースケースをサポートする方法の例を次に示します。

マッピング ドキュメント (bindings.xml)

xml-elementsこのユース ケースではマッピングを使用できます。ネストされたxml-elementマッピングのそれぞれで、異なる を指定しますxml-path

<?xml version="1.0"?>
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum17977009">
    <java-types>
        <java-type name="Content">
            <xml-root-element/>
             <java-attributes>
                <xml-elements java-attribute="elements">
                    <xml-element xml-path="a/b"/>
                    <xml-element xml-path="c/d"/>
                </xml-elements>
             </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Java モデル (コンテンツ)

以下は、この例で使用する Java モデルです。

package forum17977009;

import java.util.List;

public class Content {

    private List<ElementType> elements;

    public List<ElementType> getElements() {
        return elements;
    }

    public void setElements(List<ElementType> elements) {
        this.elements = elements;
    }


}

jaxb.properties

MOXy を JAXB プロバイダーとして指定するにはjaxb.properties、次のエントリを使用して、ドメイン モデルと同じパッケージに呼び出されるファイルを含めます ( http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-yourを参照)。 .html )。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

入力 (input.xml)

以下は入力ドキュメントのサンプルです。

<?xml version="1.0" encoding="UTF-8"?>
<content>
    <a>
        <b/>
        <b/>
    </a>
    <c>
        <d/>
        <d/>
    </c>
</content>

デモ

以下は、すべてが機能することを証明するために実行できるデモ コードです。

package forum17977009;

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 {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum17977009/bindings.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Content.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum17977009/input.xml");
        Content content = (Content) unmarshaller.unmarshal(xml);

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

}

出力

すべての項目が同じタイプであるため、マッピングxml-pathの最初の項目に基づいて出力されます。xml-elementxml-elements

<?xml version="1.0" encoding="UTF-8"?>
<content>
   <a>
      <b/>
      <b/>
      <b/>
      <b/>
   </a>
</content>

アップデート

XPath のどの部分が MOXy でサポートされているかを指定する場所がドキュメントに存在しますか?

以下に役立つ例をいくつか示します。

マッピング用に入力された XPath ステートメントに検証を追加します。次のリンクを使用して、これに関する進捗状況を追跡できます。

于 2013-07-31T17:53:14.990 に答える