2011-02-25 84 views
3

我有一個xml結構「Filter」,它被解組到一個名爲「Filter」的java類中。如何讓jaxb在解組過程中忽略某些數據

的XML狀態看起來大致是:

<filter> 
    <propertyType> 
    <propertyName>prop1</propertyName> 
    <propertyValue>val1</propertyValue> 
    </propertyType> 
    <propertyType> 
    <propertyName>prop2</propertyName> 
    <propertyValue>val2</propertyValue> 
    </propertyType> 
</filter> 

通常情況下,它的偉大工程。

然而,有些情況下這些屬性值本身的一個包含XML結構(見下文第二的PropertyValue)某些情況下:

<filter> 
    <propertyType> 
    <propertyName>prop1</propertyName> 
    <propertyValue>val1</propertyValue> 
    </propertyType> 
    <propertyType> 
    <propertyName>prop2</propertyName> 
    <propertyValue><nodeA><nodeB>valB</nodeB></nodeA></propertyValue> 
    </propertyType> 
</filter> 

這裏的問題是,解編這種結構後,是的PropertyValue空。

我想簡單地能夠unmarshalling忽略這個XML看起來代碼,並將其視爲一個簡單的字符串值。

有誰知道我該如何做到這一點?謝謝你的回覆!

回答

0

AFAIK JAXB在xml模式下工作,將XML解編組爲Java對象。因此,如果模式將元素定義爲簡單元素,則它只能包含文本。如果您需要將XML存儲爲簡單文本。您可能需要使用CDATA構造來轉義它。嘗試使用下圖所示的相同方法,在不加掩飾的情況下,您將獲得XML。

<filter> 
    <propertyType> 
    <propertyName>prop1</propertyName> 
    <propertyValue>val1</propertyValue> 
    </propertyType> 
    <propertyType> 
    <propertyName>prop2</propertyName> 
    <propertyValue><![CDATA[<nodeA><nodeB>valB</nodeB></nodeA>]]></propertyValue> 
    </propertyType> 
</filter> 
+0

壞,壞的意見。不要將可分析數據視爲未分析的數據。 – 2011-03-03 14:43:43

1

如何使用「@XmlAnyElement」的註釋? 你可以得到org.w3c.dom.Element的實例。 應該可以通過操作這個實例來獲取文本數據。

class PropertyType { 
    private String propertyName; 
    // private String propertyValue; // comment out 
    @XmlAnyElement(lax=true) 
    private List<org.w3c.dom.Element> propertyValue; // Adding this 
} 

獲取文本數據的示例。

// It is assumed that the child node is one. 
org.w3c.dom.Node nd = propertyValue.get(0).getFirstChild(); 
while(true) { 
    if (nd.hasChildNodes()) { 
     nd = nd.getFirstChild(); 
    } else { 
     System.out.println(nd.getNodeValue()); // this is text data 
     break; 
    } 
} 
+0

通過大家的意見解決了我的問題。感謝你的支持。 – TimC 2011-03-08 17:50:39

1

對於這種用例,我將創建一個將轉換XML文檔的XSLT。然後,使用javax.xml.transform的*的API,將XML轉換到JAXBResult解組對象:

import java.io.File; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.util.JAXBResult; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     TransformerFactory tf = TransformerFactory.newInstance(); 

     File xsltFile = new File("transform.xsl"); 
     StreamSource xsltSource = new StreamSource(xsltFile); 
     Transformer transformer = tf.newTransformer(xsltSource); 

     File xml = new File("input.xml"); 
     StreamSource xmlSource = new StreamSource(xml); 

     JAXBContext jc = JAXBContext.newInstance(Filter.class); 
     JAXBResult jaxbResult = new JAXBResult(jc); 

     transformer.transform(xmlSource, jaxbResult); 

     Filter filter = (Filter) jaxbResult.getResult(); 
    } 

} 

transform.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="propertyValue"> <xsl:value-of select="descendents"/> 
     <xsl:element name="propertyValue"> 
      <xsl:value-of select="node()"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

我不認爲這個樣式表會做你想要的... – 2011-03-03 14:46:59

+0

@Alejandro:樣式表爲這個例子產生了正確的結果,儘管我同意可能有更好的方法來編寫它。我的答案的焦點是可以使用JAXB和XSLT的組合來實現預期的結果。 – 2011-03-03 15:03:48

相關問題