2011-05-13 84 views
0

我有一個XML內容沒有定義的屬性,如:如何檢測所需的XML屬性?

<rootElement> 
    <subElement1/> 
</rootElement> 

我要填充與XML架構(XSD),此XML定義所需的屬性此XML內容。

例如,根據XSD,subElement1已經要求屬性'id'。

什麼是最好的方法(用於Java處理)來檢測並將這些屬性添加到XML? 我們需要添加必需的屬性併爲它們設置合適的值。

例如,作爲上述結果,我們需要有以下XML:

<rootElement> 
    <subElement1 id="some-value"/> 
</rootElement> 

回答

0

使用DOM parser.Has方法來遍歷XML樹,訪問,插入和刪除節點

+0

我知道了。但是我如何找到必需的屬性?我看了SAX解析器,並沒有找到如何去做。 – Nawa

+1

請查閱http://tutorials.jenkov.com/java-xml/dom-schema-validation.html。您激活驗證並使用錯誤處理程序...可能是一個解決方案 – Cris

+0

是的,我有這個想法,以防萬一 – Nawa

3

我會建議你爲此使用JAXB。在互聯網上搜索教程。

步驟與JAXB繼續進行,

  1. 通過提供架構
  2. 解組的XML,以便生成的Java類(豆)生成使用JAXB Java文件。不要在這裏進行驗證或設置驗證處理程序。
  3. 用適當的值填充這些類。可以使用註釋查找找到required元素。元素的JAXB註釋看起來像@XmlElement(name = "ElementName", required = true)。並且屬性註釋將與此類似,@XmlAttribute(required = true)
  4. 將bean編組回到XML。您可以在編組時使用ValidationHandler驗證您的bean。下面是示例代碼段,

    marshller = JAXBContext.newInstance(pkgOrClassName).createUnmarshaller(); 
    marshller.setSchema(getSchema(xsd)); // skip this line for unmarshaller 
    marshller.setEventHandler(new ValidationHandler()); // skip this line for unmarshaller 
    
+0

這可能是靜態xml和xsd的好方法。但是我必須在我的代碼 – Nawa

+0

@Nawa中安排屬性:您的xsd/schema很可能會被修復。但是,是的,XML可以是任何遵守該架構的文件。但我相信這會爲此而工作。否則,請詳細說明您遇到的具體問題。 –

+0

初始xml通常不包含屬性,只存在標記,由於缺少必需的屬性,它可能無法在模式中使用。我想在初始xml中填充所有必需的屬性以使其有效。 – Nawa

3

在XML模式定義,即XSD文件,屬性默認都是可選的。爲了使所需要的屬性,你必須定義:

<xs:attribute name="surname" type="xs:string" use="required"/> 

你會發現XML和XML模式定義,即XSD一個很好的介紹,對W3 Schools

在Java中,定義XML模式的等價物是使用JAXB,即包含在Java SE中的用於XML綁定的Java API。在那裏你會定義,例如

@XmlRootElement 
public class Person { public @XmlAttribute(required=true) String surname; } 

希望這可以澄清你的問題。

+0

我知道如何在XSD中定義必需的屬性,但這不是我的任務。我只想在XML中插入所有必需的屬性 – Nawa

+0

一旦您有了表示您的XML實體的JAXB類,就可以使用反射查詢註釋以獲取必需的屬性。 –

0

我對Cris有同樣的想法,但我認爲使用此驗證程序,您不具有有關發生錯誤的點的信息。 我認爲你必須創建或擴展你自己的驗證器。