簡體   English   中英

解析xml文件,重命名標簽並再次保存

[英]Parse xml file, rename tag and save it again

我有一個很大的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個新類BEZIEHUNGENBEZIEHUNGSTYPPRODUKT_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 omit-xml-declaration="yes" indent="yes" ,但這只是部分修復了它,因為現在看起來像這樣:

xml文件 哪個沒有以前的格式,不確定為什么嗎?

在樣式表文件中使用它:

    <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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM