gpt4 book ai didi

java - 如何解码包裹在另一个元素中的元素

转载 作者:太空宇宙 更新时间:2023-11-04 10:55:03 25 4
gpt4 key购买 nike

我想解码以下 XML 并从中仅提取 CD 元素列表:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Header>
<SomData>
<Name>Name</Name>
</SomData>
</Header>
<Message>
<DziubasekInfo>
<some_data>Data</some_data>
</DziubasekInfo>
<CATALOG>
<Entry>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</Entry>
<Entry>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
</Entry>
<Entry>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
</Entry>
</CATALOG>
</Message>
</Root>
<小时/>

这是我实际有效的代码:

@XmlRootElement(name="CATALOG")
@XmlAccessorType(XmlAccessType.FIELD)
public class Catalog {


@XmlElement(name = "Entry", type = Entry.class)
private List<Entry> list = new ArrayList<>();

.... getters, setters

}
<小时/>
@XmlType(name="Entry")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {


@XmlElement(name = "CD", type = Cd.class)
private List<Cd> cdList = new ArrayList<>();

... getters, setters

}
<小时/>
@XmlType(name="CD")
@XmlAccessorType(XmlAccessType.FIELD)
public class Cd {

@XmlElement(name="TITLE")
private String title;

@XmlElement(name="ARTIST")
private String artist;

@XmlElement(name="PRICE")
private String price;

.... getters, setters

}
<小时/>
InputStream inp = getClass().getResourceAsStream("cd_catalog.xml");

XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource source = new StreamSource(inp);

XMLStreamReader xsr = xif.createXMLStreamReader(source);

while (!(xsr.isStartElement() && "CATALOG".equals(xsr.getLocalName()))) {
xsr.next();
}

JAXBContext jc = JAXBContext.newInstance(Catalog.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Catalog catalog = unmarshaller.unmarshal(xsr, Catalog.class).getValue();

System.out.println("Entries = " + catalog.getList().size());

for (Entry e : catalog.getList()) {
System.out.format("CD: %20s / %30s / %10s\n",
e.getCdList().get(0).getArtist(),
e.getCdList().get(0).getTitle(),
e.getCdList().get(0).getPrice());
}

xsr.close();
<小时/>

如您所见,这里有 3 个类:Catalog 包装了 Entry ,而 Entry 又包装了 Cd 类。
实际上每个 Entry 仅包含一个 Cd 条目。

有没有办法消除其中一个包装类并仅使用 2 个类而不是 3 个类?
并且稍微简化一下这段代码,尤其是这个片段看起来有点尴尬:

e.getCdList().get(0).getArtist(), 
e.getCdList().get(0).getTitle(),
e.getCdList().get(0).getPrice()

如果列表中只有一个项目并且总是只得到这个单个条目,这有点愚蠢,最好这样做:

e.getCdList().getArtist(), e.getCdList().getTitle(), e.getCdList().getPrice()

最佳答案

任何与 XML 相关的映射的基本点不是代码,而是 XML。(实际上是 XML Schema)。您的 JAXB 注释定义了架构。因此,如果您的 XML 有架构就像你展示的那样:

<CATALOG>
<Entry>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</Entry>
...

那就这样吧。入口元件有CD元件。如果您想消除 CD 元素,您的 XML 必须如下所示:

<CATALOG>
<Entry>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</Entry>

不多也不少...Java 对象(带有 JAXB 注释)只是 XML 模式规定内容的反射(reflect)。如果您无法更改 XML - 您就必须忍受这一点。

顺便说一句:我很确定 Entry 可能有 CD 以外的元素,如 DVD、TAPE、VINIL 等...

关于java - 如何解码包裹在另一个元素中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47401785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com