2013-12-14 106 views
0

我一直在使用XStream進行一些簡單的XML轉換,但是我被困在這一張上。我想要做的是創建一個Java程序來讀取和調整這種類型的XML;使用XStream將過度複雜的XML轉換爲Java對象

<?xml version="1.0" encoding="utf-8"?> 
<actor id="id273212" PGFVersion="0.19" GSCVersion="0.10.4"> 
    <attributes> 
    <text id="name">Actor 1c</text> 
    <real id="time">0</real> 
    <point id="position"> 
     <real id="x">0</real> 
     <real id="y">0</real> 
    </point> 
    <size id="size"> 
     <real id="width">120</real> 
     <real id="height">120</real> 
    </size> 
    <angle id="rotation">0</angle> 
    <color id="color"> 
     <real id="red">1</real> 
     <real id="green">1</real> 
     <real id="blue">1</real> 
     <real id="alpha">1</real> 
    </color> 
    <image id="image" /> 
    <text id="tags" /> 
    <boolean id="preloadArt">true</boolean> 
    </attributes> 
    <behaviors /> 
    <aspects> 
    <graphics> 
     <attributes> 
     <boolean id="visible">true</boolean> 
     <enumeration id="blendingMode">0</enumeration> 
     <enumeration id="horizontalWrap">0</enumeration> 
     <enumeration id="verticalWrap">0</enumeration> 
     <enumeration id="horizontalAnchor">0</enumeration> 
     <enumeration id="verticalAnchor">0</enumeration> 
     <boolean id="flipHorizontally">false</boolean> 
     <boolean id="flipVertically">false</boolean> 
     <integer id="tileWidth">0</integer> 
     <integer id="tileHeight">0</integer> 
     </attributes> 
    </graphics> 
    <motion> 
     <attributes> 
     <point id="linearVelocity"> 
      <real id="x">0</real> 
      <real id="y">0</real> 
     </point> 
     <real id="angularVelocity">0</real> 
     <real id="maxSpeed">0</real> 
     <boolean id="applyMaxSpeed">false</boolean> 
     </attributes> 
    </motion> 
    <physics> 
     <attributes> 
     <real id="density">1</real> 
     <real id="friction">3</real> 
     <real id="restitution">1</real> 
     <boolean id="fixedRotation">false</boolean> 
     <boolean id="movable">true</boolean> 
     <enumeration id="collisionShape">0</enumeration> 
     <real id="drag">0</real> 
     <real id="angularDrag">0</real> 
     </attributes> 
    </physics> 
    </aspects> 
</actor> 

我不明白怎麼做:<text id="name">Actor 1c</text>

我能得到的最接近的是:

<text id="name"> 
    <variables>Actor 1c</variables> 
    </text> 

我做什麼,我創建了接受一個「文本」類字符串(「Actor 1c」)轉換爲「變量」。

我試過使用「addImplicitCollection」,但它不起作用。我知道這個問題沒有一個簡單的答案,但我應該如何構建我的Java,以便我可以讀取這些XML文件?

+0

下面介紹如何使用'@ XmlValue'將它與JAXB進行映射:http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html –

+0

@Blaise Doughan I仍然不明白。你在那裏描述的就像使用'xstream.useAttributeFor(PhoneNumber.class,「type」);' 我已經能夠做到這一點。當我在TextNumber中使用'Text text1 = new Text();'時,我無法打印出來。 – cbt

回答

0

對我來說,這裏最難的部分是<attributes>的地圖,它可以存儲複雜的對象。在Java中,這看起來像是對象的HashMap。現在,您的屬性具有ID,並且這將是用於輸入該散列映射的關鍵。這意味着您很可能需要爲您的XML節點定製轉換器。

根據我對這些文檔的經驗,這不是很有效,我總是最終研究XML工具的實現細節,以瞭解它爲什麼不起作用。另一個問題是,XML文檔在某些部分可能會變得富有創造性,特別是在沒有模式的情況下,這是工具不太受歡迎的。

所以我會建議嘗試解析與StAX解析器 - 走樹和手動轉換節點。或者將其轉換爲DOM樹,然後將DOM樹轉換爲對象。

0

的XStream的ToAttributedValueConverter可以幫助你在這裏:

@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"}) 
@XStreamAlias("text") 
public class Text { 
    private String value; 
    private String id; 

    // getters/setters/etc. as appropriate 
} 

通過「串」命名的字段將被用於存儲元素的文本內容,而其他字段映射到屬性。

+0

你能否給我多一點細節?我應該建立 - >公共ToAttributedValueConverter(類類型, 映射器映射, ReflectionProvider reflectionProvider, ConverterLookup查找, 字符串valueFieldName) – cbt

+0

@canberk你不應該需要建立任何東西,'ToAttributedValueConverter'是一個標準的XStream的類,並把你的類上的'@ XStreamConverter'註釋應該足以激活它。與往常一樣,當您使用基於註解的配置進行閱讀時,您還需要調用'xstream.processAnnotations(Text.class)'(對於其他任何已註釋的類都是相同的)。 –