尝试用map中的属性和映射键值解析XML



我必须解析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}

map没有返回预期的结果。我想添加到一个映射键和值。我希望是这样的:

key: META_1
value: 123456789
key: META_2
value: Someone
...

我尝试了几种方法来映射这个XML,但没有成功。由于

我简单修改了我的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;
}

我用一个对象列表替换了Map。为此,我实现了这个POJO:

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

按预期检索数据。那很酷…

最新更新