我有一个很大的xml文件,需要对其进行一些更改,这是其外观的摘要
<CMPDN>
<ROOT_PRODUKTE>
<PRODUKT name="00010000040">
<BEZIEHUNGEN>
<BEZIEHUNGSTYP name="ZBH2BIKE">
<PRODUKT name="78104974100" id="1001049290">
<RELATEDARTICLES>
<RELATEDARTICLE name="F6101M0" id="1000264817"/>
</RELATEDARTICLES>
</PRODUKT>
</BEZIEHUNGSTYP>
</BEZIEHUNGEN>
</PRODUKT>
</ROOT_PRODUKTE>
这只是一个摘要。 我使用jxb将xsd文件转换为Java类,因此现在可以修改数据了。
当我想重命名标签之一,而不仅仅是任何标签时,问题就来了。我想将内部PRODUKT标记重命名为PRODUKT_FIT,如下所示:
<CMPDN>
<ROOT_PRODUKTE>
<PRODUKT name="00010000040">
<BEZIEHUNGEN>
<BEZIEHUNGSTYP name="ZBH2BIKE">
<PRODUKT_FIT name="78104974100" id="1001049290">
<RELATEDARTICLES>
<RELATEDARTICLE name="F6101M0" id="1000264817"/>
</RELATEDARTICLES>
</PRODUKT_FIT>
</BEZIEHUNGSTYP>
</BEZIEHUNGEN>
</PRODUKT>
</ROOT_PRODUKTE>
现在,我尝试创建3个新的类BEZIEHUNGEN
,BEZIEHUNGSTYP
和PRODUKT_FIT
,并更改了PRDUKT类的定义,如此处所示
public class PRODUKT {
@XmlElements({
@XmlElement(name = "ATTRIBUTE", type = ATTRIBUTE.class),
@XmlElement(name = "BEZIEHUNGEN", type = io.github.sumsar1812.models.write.BEZIEHUNGEN.class),
@XmlElement(name = "BEZIEHUNGEN", type = BEZIEHUNGEN.class),
@XmlElement(name = "KLASSEN", type = KLASSEN.class),
@XmlElement(name = "LAENDER", type = LAENDER.class),
@XmlElement(name = "MEDIENELEMENTE", type = MEDIENELEMENTE.class),
@XmlElement(name = "PREISE", type = PREISE.class),
@XmlElement(name = "RELATEDARTICLES", type = RELATEDARTICLES.class),
@XmlElement(name = "TEXTELEMENTE", type = TEXTELEMENTE.class),
@XmlElement(name = "PARENT_NAME", type = PARENTNAME.class),
})
models.write包中包含新的3个类。
PRODUKT_FIT类如下所示:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"attributeOrBEZIEHUNGENOrKLASSEN"
})
@XmlRootElement(name = "PRODUKT_FIT")
public class PRODUKT_FIT {
@XmlElements({
@XmlElement(name = "ATTRIBUTE", type = ATTRIBUTE.class),
@XmlElement(name = "BEZIEHUNGEN", type = io.github.sumsar1812.models.write.BEZIEHUNGEN.class),
@XmlElement(name = "KLASSEN", type = KLASSEN.class),
@XmlElement(name = "LAENDER", type = LAENDER.class),
@XmlElement(name = "MEDIENELEMENTE", type = MEDIENELEMENTE.class),
@XmlElement(name = "PREISE", type = PREISE.class),
@XmlElement(name = "RELATEDARTICLES", type = RELATEDARTICLES.class),
@XmlElement(name = "TEXTELEMENTE", type = TEXTELEMENTE.class)
})
protected List<Object> attributeOrBEZIEHUNGENOrKLASSEN;
@XmlAttribute(name = "name", required = true)
protected String name;
/*getters and setters omitted */
据我所知,一个产品应该既可以包含BEZIEHUNGEN的读取值,又可以包含BEZIEHUNGEN的写入值(包含一个BEZIEHUNGSTYP列表,每个包含一个PRODUKT_FIT列表)
重新格式化一些数据后,我可以在调试器中看到数据的格式正确(RELATEDARTICLE是可选的,因此,为什么attributeOrBEZIEHUNGENOrKLASSEN为null)
但是问题是,当我尝试将类保存回文件时(如下所示),它仍然命名为PRODUKT而不是PRODUKT_FIT,我对数据所做的所有其他更改都正确保存了。知道为什么会这样吗?
public void passRoot(String newFilename, CMPDN root) {
try {
File file = new File(newFilename);
JAXBContext jaxbContext = JAXBContext.newInstance(CMPDN.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
jaxbMarshaller.marshal(root, file);
} catch (JAXBException e) {
e.printStackTrace();
}
}
修改 所以我尝试使用XSLT取得了一些成功,这是我现在的样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="CMPDN/ROOT_PRODUKTE/PRODUKT/BEZIEHUNGEN/BEZIEHUNGSTYP/PRODUKT">
<PRODUKT_FIT>
<xsl:apply-templates select="@*|node()" />
<xsl:value-of select="."/>
</PRODUKT_FIT>
</xsl:template>
此方法有效,但它在/RELATEDARTICLES>
和</PRODUKT_FIT>
下添加了空行,因此我尝试添加<xsl:strip-space elements="*"/>
,但将其全部合并为一行,因此我在omit-xml-declaration="yes" indent="yes"
上添加了xsl:output,但这只能部分修复它,因为现在看起来像这样:
答案 0 :(得分:1)
在样式表文件中使用它:
<xsl:output method="xml" omit-xml-declaration="yes"
indent="yes" encoding="utf-8" xslt:indent-amount="3"
xmlns:xslt="http://xml.apache.org/xslt" />
<xsl:strip-space elements="*" />
当然,您可以根据需要配置indent-amount
。
有关更多信息,请参见Apache Xalan。