2011-08-02 40 views
3

編輯:這是我如何加載XML文檔,因爲我在Blaise的答案中使用它。我像這樣加載它,因爲我想使用節點,而不是整個文檔。即使使用整個文檔,我仍然在以這種方式加載時遇到麻煩。使用MOXy和XPath,是否可以解組一個屬性列表?

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); 

我有XML,看起來像這樣:

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

和A類:

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

    // getters, setters omitted 
} 

上面的代碼將作品是否我有@XmlElement,我得到一個包含[cookie,crackers]的ArrayList。

如果我改變上面

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

我的ArrayList是空的聲明。

我的最終目標是隻是有屬性,所以我的XML看起來像這樣:

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

是我想要做的,拉出來使用XPath,可能的屬性列表,如果是這樣, 怎麼樣?

謝謝。

回答

2

UPDATE

我已經能夠確認你所看到的問題(https://bugs.eclipse.org/353763)。一個修復程序已被添加到我們的EclipseLink 2.3.1和2.4.0流和從夜間下載頁開始獲得2011年8月4日:

解決方法:

您可以通過設置您的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.properties文件來指定EclipseLink MOXy作爲你的JAXB提供者?:

測試類

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); 
    } 

} 

的input.xml

<?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版本=「1.0」編碼=「UTF-8」> '我需要最終與節點工作 - 我應該如何加載文檔,所以我可以拉出一個節點並通過Moxy/JAXB運行? – Paul

+0

我做了更多的測試,試圖從每個項目中拉出值和屬性。我可以得到的價值,但不是屬性仍然。 – Paul

+0

最後一個測試...如果餘添加屬性的項目,'<項目類型=「blarg」>',我可以檢索它就好,例如'@XmlPath(「items/@ type」)',而不是'item'。 – Paul

相關問題