2017-07-05 97 views
0

我在工作的方法來過濾與XML文件的集合(文件清單)如果一個特定的XML標記有一個屬性...JAXB檢查XML的標記具有特定屬性

詳細.. 。我想過濾所有的xml文件,其中的xml標籤有一個屬性「is_special」,但我有問題來設置我的模型類的屬性。

在我要保存文件的名稱和它的項目,其中的值具有屬性is_special =「真」

而且我使用與莫西擴展JAXB框架列表末尾...

的XML的結構如下:

<document> 
<id>75C8866AB078DCE541256D16002CF636</id> 
<size>806220</size> 
<author>xxx</author> 
<last_modified>2017.06.12 07:15:41 GMT</last_modified> 
<added_to_file>2016.07.05 09:50:44 GMT</added_to_file> 
<created>2003.04.28 08:11:06 GMT</created> 
<items> 
    <item> 
     <name>someName/name> 
     <type>LNITEMTYPE_DATETIMES</type> 
     <values> 
      <value is_special="true"/> 
     </values> 
     <last_modified>2003.04.28 08:11:10 GMT</last_modified> 
     ... 
    </item> 
    <item> 
     <name>someName/name> 
     <type>LNITEMTYPE_TEXT</type> 
     <values> 
      <value>SOMETEXT</value> 
      <value>SOMETEXT</value> 
     </values> 
     <last_modified>2003.04.28 08:11:10 GMT</last_modified> 
     ... 
    </item> 
</items> 

爲此我有3類,針對XML的文件...

「XMLDocument.java」 實現 「Items.java」 它實現了 「Value.java」

XMLDocument.java名單列表

@XmlRootElement(name = "notes_document") 
public class XMLDocument { 

... 
private List<Item> items; 

... 

@XmlElementWrapper(name = "items") 
@XmlElement(name = "item") 
public List<Item> getItems() { 
    return items; 
} 

public void setItems(List<Item> items) { 
    this.items = items; 
} 
} 

item.java

@XmlRootElement(name = "items") 
public class Item { 

    private String name; 
    private List<String> values; 
    private boolean valueIsSpecial; 

    @XmlElement(name = "name") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @XmlElementWrapper(name = "values") 
    @XmlElement(name = "value") 
    public List<String> getValues() { 
     return values; 
    } 

    public void setValues(List<String> values) { 
     this.values = values; 
    } 

    @XmlPath("value/@is_special") 
    public boolean getValueIsSpecial() { 
     return valueIsSpecial; 
    } 

    public void setValueIsSpecial(boolean valueIsSpecial) { 
     this.valueIsSpecial = valueIsSpecial; 
    } 
} 

value.java

@XmlRootElement(name = "values") 
public class Value { 
    @XmlElement(name = "value") 
    private String itemValue; 
    @XmlPath("value/@is_special") 
    private boolean isSpecial; 

    public String getValue() { 
     return itemValue; 
    } 

    public void setValue(String value) { 
     this.itemValue = value; 
    } 

    public boolean getValueIsSpecial() { 
     return isSpecial; 
    } 

    public void setValueIsSpecial(boolean isSpecial) { 
     this.isSpecial = isSpecial; 
    } 
} 

我的方法到目前爲止...

public void FilterTree_isSpecial() throws JAXBException, FileNotFoundException { 

     for(String file: FileList) { 
      if (file.endsWith(".xml") && !file.contains("databaseinfo.xml")) { 

       JAXBContext context = JAXBContext.newInstance(NotesDocumentMetaFile.class); 
       Unmarshaller um = context.createUnmarshaller(); 
       NotesDocumentMetaFile docMetaFile = (XMLDocument) um.unmarshal(new FileReader(file)); 
       for (int i = 0; i < docMetaFile.getItems().size(); i++) { 

        // CHECK IF THE <value> OF THIS ITEM HAS ATTRIBUTE is_special 

       }    
      } 
     } 
    } 

許多文字...我希望任何人都可以給我一個解決方案:/

+0

XML中存在錯誤。你應該關閉第一個「價值」標籤。 –

+0

[編輯]其自己關閉...感謝提示 –

+0

這可以很容易地由java的xpath完成,你需要Jaxb的一些其他目的嗎? – SomeDude

回答

1

其實在你Item.java需求的XPath是:values/value/@is_special@XmlPath("values/value/@is_special")

如果您想在is_specialValue.java也是你的XPath應該是:

@is_special像:@XmlPath(@is_special)

另外你的Item.java,Value.java需要一點點改變。你不需要@XmlRootElement,你已經有它在你的XmlDocument.java

Item.java應該是:

public class Item 
{ 

    private String name; 

    private String type; 

    private String lastModified; 

    private List<Value> values; 

    private String isSpecial; 


    @XmlPath("values/value/@is_special") 
    public String getIsSpecial() { 
     return isSpecial; 
    } 

    public void setIsSpecial(String isSpecial) { 
     this.isSpecial = isSpecial; 
    } 

    @XmlElement(name="type") 
    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    @XmlElement(name="last_modified") 
    public String getLastModified() { 
     return lastModified; 
    } 

    public void setLastModified(String lastModified) { 
     this.lastModified = lastModified; 
    } 


    @XmlElement(name="name") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    @XmlElementWrapper(name="values") 
    @XmlElement(name="value") 
    public List<Value> getValues() { 
     return values; 
    } 


    public void setValues(List<Value> values) { 
     this.values = values; 
    } 


} 

Value.java應該是:

public class Value 
{ 

    @XmlPath("text()") 
    private String value; 

    @XmlPath("@is_special") 
    private String isSpecial; 

    public String getIsSpecial() { 
     return isSpecial; 
    } 

    public void setIsSpecial(String isSpecial) { 
     this.isSpecial = isSpecial; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 


} 

注意,得到valueis_specialValue.java,你可以使用@XmlPath

現在你可以撥打getIsSpecial()Item.java來檢查它是否是特殊的。

+1

謝謝......對我有用! –

相關問題