2013-06-20 37 views
2

我試圖解組給定的XML生成的目標:JAXB解組與聲明的類型不填充數據

<FHcomment> 
<TX>rewriting of file</TX> 
<tool_id>toolA</tool_id> 
<tool_vendor>Company</tool_vendor> 
<tool_version>1.7.36.0</tool_version> 
</FHcomment> 

的模式已經被編譯JAXB類,在這裏看到:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
"tx", 
"toolId", 
"toolVendor", 
"toolVersion", 
"userName", 
"commonProperties", 
"extensions" 
}) 
@XmlRootElement(name = "FHcomment") 
public class FHcomment { 

@XmlElement(name = "TX", required = true) 
protected TX tx; 
@XmlElement(name = "tool_id", required = true) 
protected BaseName toolId; 
@XmlElement(name = "tool_vendor", required = true) 
protected BaseName toolVendor; 
@XmlElement(name = "tool_version", required = true) 
protected BaseVersion toolVersion; 
@XmlElement(name = "user_name") 
protected BaseName userName; 
@XmlElement(name = "common_properties") 
protected CommonPropertiesType commonProperties; 
protected ExtensionsType extensions; 
@XmlAnyAttribute 
private Map<QName, String> otherAttributes = new HashMap<QName, String>(); 

..... 
/* 
* GETTERS and SETTERS for the fields have been removed here 
*/ 
..... 
} 

我的代碼來解組​​XML如下:

JAXBContext jc = JAXBContext.newInstance(FHcomment.class); 
String s = "<FHcomment>....</Fhcomment>"; 
Unmarshaller unmarshaller = jc.createUnmarshaller(); 
XMLInputFactory fac = XMLInputFactory.newFactory(); 
XMLStreamReader xsr = fac.createXMLStreamReader(new StringReader(s)); 
JAXBElement<FHcomment> foo = unmarshaller.unmarshal(xsr, FHcomment.class); 
FHcomment val = foo.getValue(); 

習題lem:生成的FHcomment對象不包含FHcomment的子元素。所有這些都不是理想的結果。

如何告訴JAXB將給定的XML完全解組爲對象?

編輯:添加ValidationHandler到Unmsarshaller後,我走近的問題:

意想不到的元素(URI: 「」,當地: 「TX」)。預期的元素是< {htp://www.example.com/mdf/v4} tool_id>,< {htp://www.example.com/mdf/v4} TX>,< {htp://www.www .example.com/mdf/v4} common_properties>,< {htp://www.example.com/mdf/v4} tool_version>,< {htp://www.example.com/mdf/v4} extensions>, < {htp://www.example.com/mdf/v4} tool_vendor>,< {htp://www.example.com/mdf/v4} user_name>

意外元素(uri: 「」,local:「tool_id」)。預計元素....

原來JAXB不喜歡的事實,提供的XML不包含命名空間信息..所以我怎麼告訴解組忽略命名空間?

EDIT2:

一些調查研究後,我無法找到一個方法來欺騙JAXB到沒有命名空間的驗證工作。我使用了教程http://cooljavablogs.blogspot.de/2008/08/how-to-instruct-jaxb-to-ignore.html來規避我的問題。不是一個很好的解決方案,但手頭最好...

+0

這是不是遞歸的,只是一個簡單的JAXB解組。它會自動執行,所以其他問題就是這個問題。 (xml vs. Java類) –

+0

將主題修改爲更具體/更正 – Slacky

回答

0

更改BaseNameTX爲字符串,它應該工作。因爲它是xml不符合您的模式,在這種情況下由類表示。

+0

不幸的是,類會生成,並且在對模式定義進行更新後,任何修改都將丟失。 – Slacky

+0

然後更新xml ...順便說一下,您還需要製作BaseName和TX xml-serializable。如果您使用自定義類作爲JAXB類中的屬性,那麼這是XSD中的「複雜類型」。 –

0

嘗試下面的代碼刪除,然後再試一次:

@XmlType(name = "", propOrder = { 
    "tx", 
    "toolId", 
    "toolVendor", 
    "toolVersion", 
    "userName", 
    "commonProperties", 
    "extensions" 
    }) 
3

你的XML文檔不匹配您的映射(參見:http://blog.bdoughan.com/2010/08/jaxb-namespaces.html)中定義的命名空間的資格。在解組操作期間,您可以利用XMLFilter將命名空間應用於XML文檔。

import org.xml.sax.*; 
import org.xml.sax.helpers.XMLFilterImpl; 

public class NamespaceFilter extends XMLFilterImpl { 

    private static final String NAMESPACE = "htp://www.example.com/mdf/v4"; 

    @Override 
    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
     super.endElement(NAMESPACE, localName, qName); 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes atts) throws SAXException { 
     super.startElement(NAMESPACE, localName, qName, atts); 
    } 

} 

下面是你如何在解組過程中充分利用XMLFilter一個例子。

// Create the XMLFilter 
    XMLFilter filter = new NamespaceFilter(); 

    // Set the parent XMLReader on the XMLFilter 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    SAXParser sp = spf.newSAXParser(); 
    XMLReader xr = sp.getXMLReader(); 
    filter.setParent(xr); 

    // Set UnmarshallerHandler as ContentHandler on XMLFilter 
    Unmarshaller unmarshaller = jc.createUnmarshaller(); 
    UnmarshallerHandler unmarshallerHandler = unmarshaller 
      .getUnmarshallerHandler(); 
    filter.setContentHandler(unmarshallerHandler); 

    // Parse the XML 
    InputSource xml = new InputSource("input.xml"); 
    filter.parse(xml); 
    Object result = unmarshallerHandler.getResult(); 

更多信息

0

你怎麼有註解的類基礎名稱,BaseVersion和TX?

如果沒有註解這些類,你將註釋的字符串這個類裏面的@XmlValue