2017-07-05 1 views
0

を持っている場合、私は特定のXMLタグが属性を持っている場合、XMLファイルのコレクション(ファイルリスト)をフィルタリングする方法で働いている具体的にはJAXBは... XMLタグは、特定の属性

をご確認ください..私はxmlタグの属性が "is_special"であるすべてのXMLファイルをフィルタリングしたいのですが、属性のモデルクラスを設定する際に問題があります。私は、ファイルの名前と値はまた

私はJAXBフレームワークMOXY拡張子を持つを使用していis_special =「true」属性を持っているそのアイテムのリストを保存したい終わり

...続きとして

XML-構造:私はXML-ファイルのための3つのクラスを持っている

<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> 

そのため...

"XMLDocument.javaは" "Value.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; 
    } 
} 
item.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; 
} 
} 

のリストを実装 "Items.java" のリストを実装

値.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; 
    } 
} 

マイメソッド実際にあなたのItem.javaニーズのxpathがあることを/

+0

XMLにエラーがあります。最初の「値」タグを閉じる必要があります。 –

+0

[編集済み]それ自体が閉鎖...ヒントありがとう –

+0

これはjavaのxpathで簡単に行うことができますが、いくつかの目的のためにJaxbが必要ですか? – SomeDude

答えて

1

values/value/@is_specialあなたの場合

@XmlPath("values/value/@is_special")のように、これまで...

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 

       }    
      } 
     } 
    } 

多くのテキスト...私は誰もが私に解決策を与えることができることを望みますでis_specialをしたいあなたのValue.javaまたあなたのXPathは次のようになります。

@is_specialのように:@XmlPath(@is_special)

Item.javaValue.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する必要があります:にvalueis_specialを取得する

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; 
    } 


} 

注意をValue.java@XmlPathを使用できます。

getIsSpecial()Item.javaに電話すると、特殊なものかどうかを確認できます。

+1

ありがとう...それは私のために働く! –

関連する問題