JAXB 检查 XML-Tag 是否具有特定属性

JAXB check if XML-Tag has specific attribute

我正在使用一种方法来过滤 xml 文件的集合 (FileList),如果特定的 xml- 标签具有属性...

详细...我想过滤所有xml-文件,其中xml-标签具有属性"is_special",但我在设置模型时遇到问题- 类 属性。

最后我想存储文件名及其项目列表,其中值具有属性 is_special="true"

我还使用带有 Moxy 扩展的 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

                }               
            }
        }
    }

很多文字...希望有大佬能给我解答:/

实际上 Item.java 中的 xpath 需要是:values/value/@is_special 就像 @XmlPath("values/value/@is_special")

如果您想要 Value.java 中的 is_special,您的 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 应该是:

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 中获得 valueis_special,您可以使用 @XmlPath.

现在您可以在 Item.java 上调用 getIsSpecial() 来检查它是否特殊。