【问题标题】:Trying to parse XML with attribute and map key values in a Map尝试使用 Map 中的属性和映射键值解析 XML
【发布时间】:2021-08-25 12:07:25
【问题描述】:

我必须解析一个 XML:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <contentType>Document</contentType>
    <siteName>mySite</siteName>
    <listName>myLib</listName>
    <folderName>docset-folder</folderName>
    <documentSetName>documentSet</documentSetName>
    <fields>
        <field name="META_1">123456789</field>
        <field name="META_2">Someone</field>
        <field name="META_3">Germany</field>
        <field name="META_4">Abonnement2 LC</field>
    </fields>
</data>

我创建了一个简单的 POJO 类来映射这个 XML。我设置了 XML 文件的属性。 关于字段,我可以拥有尽可能多的具有唯一名称的数据。

@Data
@XmlRootElement(name = "data")
public class MetaDataSharePoint {
    @JacksonXmlProperty(localName = "contentType")
    private String contentType;
    @JacksonXmlProperty
    private String siteName;
    @JacksonXmlProperty
    private String listName;
    @JacksonXmlProperty
    private String folderName;
    @JacksonXmlProperty
    private String documentSetName;
    @JacksonXmlElementWrapper(localName = "fields")
    @JacksonXmlProperty(localName = "field")
    private Map<String, Object> fields;
}

我的目标是正确映射此 XML 并处理 POJO。以下代码允许打开 XML 文件并读取其内容。 XMLMapper 对象允许匹配 xml 和对象。

public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException, XMLStreamException, TransformerException {
    String path = "src/test/resources/bill.xml";
    XMLInputFactory f = XMLInputFactory.newFactory();
    XMLStreamReader sr = f.createXMLStreamReader(new FileInputStream(path));
    XmlMapper mapper = new XmlMapper();

    sr.next();
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    MetaDataSharePoint metaDataSharePoint = mapper.readValue(sr, MetaDataSharePoint.class);

    // start test
    System.out.println(metaDataSharePoint);
    System.out.println("contentType : " + metaDataSharePoint.getContentType());
    System.out.println("DocumentSetName : " + metaDataSharePoint.getDocumentSetName());
    System.out.println("ListName : " + metaDataSharePoint.getListName());
    System.out.println("SiteName : " + metaDataSharePoint.getSiteName());
    System.out.println("FolderName : " + metaDataSharePoint.getFolderName());
    metaDataSharePoint.getFields().forEach((key, value) -> {
        System.out.println(key);
        System.out.println(value);
    });
    // end test

    sr.close();
}

我成功地映射了我的对象的一部分。 我打印以下内容:

MetaDataSharePoint(contentType=Document, siteName=mySite, listName=myLib, folderName=docset-folder, documentSetName=documentSet, fields={field={name=META_4, =Abonnement2 LC}})
contentType : Document
DocumentSetName : documentSet
ListName : myLib
SiteName : mySite
FolderName : docset-folder
field
{name=META_4, =Abonnement2 LC}

我的地图没有返回预期的结果。我想添加到地图键和值。 我希望是这样的:

key: META_1
value: 123456789

key: META_2
value: Someone

...

我尝试使用多种方法来映射此 XML,但均未成功。 谢谢

【问题讨论】:

    标签: java xml-parsing


    【解决方案1】:

    我简单地修改了我的 POJO:

    @Data
    @AllArgsConstructor @NoArgsConstructor
    @Builder
    @XmlRootElement(name = "data")
    public class MetaDataSharePoint {
        @JacksonXmlProperty(localName = "contentType")
        private String contentType;
        @JacksonXmlProperty
        private String siteName;
        @JacksonXmlProperty
        private String listName;
        @JacksonXmlProperty
        private String folderName;
        @JacksonXmlProperty
        private String documentSetName;
        @JacksonXmlProperty
        private List<MetaDataFields> fields;
    }
    

    我将地图替换为对象列表。为此,我实现了这个 POJO:

    @Data
    @Builder
    @AllArgsConstructor @NoArgsConstructor
    @XmlRootElement(name = "field")
    public class MetaDataFields {
        @JacksonXmlProperty(isAttribute = true)
        private String name;
        @JacksonXmlText
        private String value;
    }
    

    我按预期检索数据。太酷了……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 2014-09-06
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      相关资源
      最近更新 更多