1

参照される要素の型がわからない場合、参照をどのように処理しますか?

<input>データシンクである要素があります。この要素には、データの取得元を指定する ( による参照)<input>属性があります。によって参照される要素は、複数の要素の 1 つである可能性があります。sourceXmlIDREFsource

これは私が使用しているテストドキュメントの例です. は<input>時々要素を参照し、時には a をsource参照します.<source><vertices>

    <source id="position">
      <float_array id="arrayPosition" count="78">...</float_array>
      ...
    </source>
    <source id="normal">
      <float_array id="arrayNormal" count="144">...</float_array>
      ...
    </source>
    <vertices id="vertex">
      <input semantic="POSITION" source="position"/>
    </vertices>
    <polylist material="MyMaterial" count="40">
      <input semantic="VERTEX" source="vertex" offset="0"/>
      <input semantic="NORMAL" source="normal" offset="1"/>
      ...
    </polylist>

私が行った場合

class Input
{
    Source source;
}

要素へのすべての参照は<source>正しく機能しますが、残りの要素のソースはnull. つまりtoString()、クラスと ID を表示し、上記の入力を出力するように設定すると、次のようになります。

Source: position
null
Source: normal

最初の行は最初の要素を正しく参照し、要素<source>を参照したい2行目は 、3行目は2番目の要素を参照します。<vertices>null<source>

Input代わりにフィールドを持つように変更する場合は、代わりにandVertices sourceを取得します。意味あり。null Vertices vertexnull

これを処理するには、Java コードをどのように構成すればよいでしょうか?

XmlAdapter を調べたところ、クラスInputにフィールドObject sourceまたはMySuperClass source(およびその両方SourceVerticesサブクラスを作成) を与えるかJAXBElement source、アダプター コードで変換を試みることができると考えましたが、id 参照を保持するにはどうすればよいでしょうか?

工場での使用法を調べましXmlTypeたが、それは私が探しているものではないようです。または、最初は良い候補のように聞こえますが、少なくともそれがどのように適用されるかわかりません。

関連する用語をグーグルで検索すると、他の人が持っていた関連のないあらゆる種類の参照の問題が発生しました。

私は、それがどのように行われたとしても、1)Sourceと(およびそのフィールドで参照できるVertices他のすべてのもの) のうちの 1 つが真でなければならないと考えています。共通のスーパークラスを拡張する必要があります。または 2) aと a (など) があり、そのうちの 1 つは何かを参照し、他のすべては null になります。InputsourceInputSource source1Vertices source2ClassN sourcen

すべてのデータをアンマーシャリングし、参照を保持してすべての情報を取得できる限り、これら 2 つのシナリオのいずれでも問題ありません。また、別のシナリオでも問題ありません。非整列化する適切な方法がわかりません。

取得したxmlを制御できません。xml ドキュメントは他のプログラムによって作成され、スキーマは大きな仕様 ( http://www.khronos.org/files/collada_spec_1_4.pdf ) に従っています。xml をアンマーシャリングし、それらのファイルのデータを使用するために必要な Java コードのみを記述しています。

私は昨夜jaxbを使い始めたばかりで、うまく機能しています開発者に再び称賛を送りたい)が、このようないくつかの長引く問題がまだ解決しなければならない.

4

1 に答える 1

1

によって参照される各オブジェクト@XmlIDREFも、ネストされた関係を介して参照される必要があります。この例のように、すべてが同じクラスによって参照される必要はありません。

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElementWrapper
    @XmlElement(name="foo")
    private List<Foo> foos;

    @XmlElementWrapper
    @XmlElement(name="bar")
    private List<Foo> bars;

}

フー

で注釈が付けられたプロパティ@XmlIDREFは、ドキュメント内のどこで発生しても、任意のタイプの任意の要素と一致します。

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    @XmlID
    @XmlAttribute
    private String id;

    @XmlIDREF
    @XmlAttribute
    private Object reference;

}

バー

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Bar {

    @XmlID
    @XmlAttribute
    private String id;

}

デモ

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum17799549/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

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

}

input.xml/出力

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <foos>
        <foo id="B" reference="C"/>
        <foo id="A" reference="B"/>
    </foos>
    <bars>
        <bar id="C"/>
    </bars>
</root>

詳細については

于 2013-07-23T09:46:37.297 に答える