2011-08-02 2 views
3

編集:私はBlaiseの答えで使ったので、XML文書をどのようにロードしているのですか。私はこのように読み込んでいます。なぜなら、私はノード全体ではなく、ドキュメント全体で作業したいからです。ドキュメント全体を使用していても、この方法でロードするときにはまだ問題があります。MOXyとXPathを使用すると、属性のリストを非整列化できますか?

<test> 
    <items> 
    <item type="cookie">cookie</item> 
    <item type="crackers">crackers</item> 
    </items> 
</test> 

とクラス:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "test") 
public class TestClass 
{ 
    @XmlPath("items/item/text()") 
    @XmlElement 
    private ArrayList<String> itemList = new ArrayList<String>(); 

    // getters, setters omitted 
} 

上記のコードは、私かどうか動作します私はこのようなXMLを持って

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setValidating(false); 
factory.setNamespaceAware(false); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse("[path to doc]/input.xml"); 
TestClass testClass = (TestClass) unmarshaller.unmarshal(doc); 

@XmlElementがあり、[cookie、crackers]を含むArrayListが取得されます。

私は

@XmlPath("items/item/@type") 
@XmlElement 
private ArrayList<String> itemList = new ArrayList<String>(); 

に上記の宣言を変更した場合、私のArrayListは空です。 、

<test> 
    <items> 
    <item type="cookie"/> 
    <item type="crackers"/> 
    </items> 
</test> 

は私が何をしようとしているです可能なXPathを使用して、属性のリストを引き出し、そしてもしそうならを:

私の究極の目標は、ちょうど私のXMLは次のようになりますので、属性を持つことです、 どうやって?

ありがとうございます。

答えて

2

UPDATE

私はあなたが見ている問題(https://bugs.eclipse.org/353763)を確認することができました。修正は、当社のEclipseLink 2.3.1および2.4.0ストリームに追加されており、8月4日、2011年の開始夜間のダウンロードページから入手できます。

回避策:

あなたは名前空間を認識するようにあなたのDocumentBuilderFactoryを設定することにより、この問題を回避することができます

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse("src/forum6907225/input.xml"); 
    testClass = (TestClass) unmarshaller.unmarshal(doc); 
    marshaller.marshal(testClass, System.out); 

正しくマッピングしています(下記参照)。 JAXBプロバイダとしてEclipseLink MOXyを指定するjaxb.propertiesファイルを含めましたか?:input.xmlに

テストクラス

package forum6907225; 

import java.util.ArrayList; 

import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "test") 
public class TestClass 
{ 
    @XmlPath("items/item/@type") 
    @XmlElement 
    private ArrayList<String> itemList = new ArrayList<String>(); 

    // getters, setters omitted 
} 

デモ

package forum6907225; 

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

import org.eclipse.persistence.Version; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(TestClass.class); 
     System.out.println(Version.getVersionString()); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum6907225/input.xml"); 
     TestClass testClass = (TestClass) unmarshaller.unmarshal(xml); 

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

} 

<?xml version="1.0" encoding="UTF-8"?> 
<test> 
    <items> 
    <item type="cookie">cookie</item> 
    <item type="crackers">crackers</item> 
    </items> 
</test> 

出力

2.3.1.qualifier 
<?xml version="1.0" encoding="UTF-8"?> 
<test> 
    <items> 
     <item type="cookie"/> 
     <item type="crackers"/> 
    </items> 
</test> 
+0

あなたの例が示すように作業を行いますが、私は、私は、ドキュメントをロードする方法とそれを組み合わせたときに、私の出力はこれが(私の質問に私が作った編集を参照してください) : '2.3.0.v20110604-r9504 <?xml version =" 1.0 "encoding =" UTF-8 "?> '結局ノードを扱う必要があります。ノードとMoxy/JAXB経由でそれを実行する? – Paul

+0

私はもう少しテストを行い、各項目から値と属性の両方を取得しようとしました。値は取得できますが、属性はまだ取得できません。 – Paul

+0

最後のテストが1つあります。アイテムに属性を追加すると、 ''、それを検索できます。 '@XmlPath(" items/@ type ")'、 'item'からではありません。 – Paul

関連する問題