Saya memiliki XML dinamis yang perlu diubah berdasarkan nilai XML-nya. Node grup dengan atribut type="newNode" perlu dihapus karena sudah diturunkan.

Saya mencoba yang berikut ini:

  1. Buat node baru berdasarkan XML dan hapus node yang tidak perlu tetapi saya mengalami masalah saat menggunakan doc.removeChild(node) mengatakan

    Pengecualian di utas "main" org.w3c.dom.DOMException: NOT_FOUND_ERR: Upaya dilakukan untuk mereferensikan simpul dalam konteks yang tidak ada.

    NodeList nodeList = doc.getElementsByTagName(NODE_MAPPINGS_NODE);
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node nodeToBeRemoved = nodeList.item(i);
        if (nodeToBeRemoved.getNodeType() == Node.ELEMENT_NODE) {
            doc.getDocumentElement().removeChild(nodeToBeRemoved);
        }
    }
    
  2. Membuat dokumen baru berdasarkan dokumen asli tetapi saya menemukan kesalahan yang mengatakan

    Pengecualian di utas "main" org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: Upaya telah dilakukan untuk menyisipkan simpul di tempat yang tidak diizinkan.

    NodeList nodeList = doc.getElementsByTagName(NODE_MAPPINGS_NODE);
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            if(!node.hasAttributes()) {
                Element elem = newDoc.createElement(node.getNodeName());
                newDoc.appendChild(elem);
            }
        }
    }
    

Berikut adalah contoh XML yang saya coba uraikan:

<root>
    <input>
        <nodeMappings type="newNode">
            <name>declarationType</name>
            <type>derived</type>
            <derivedValue>X</derivedValue>
        </nodeMappings>
        <nodeMappings type="newNode">
            <name>identificationNumber</name>
            <type>derived</type>
            <derivedValue>5000000612</derivedValue>
        </nodeMappings>
        <characteristicsOfTaxPayer>
            <nodeMappings type="newNode">
                <name>collectivePerson</name>
                <type>derived</type>
                <derivedValue>X</derivedValue>
            </nodeMappings>
        </characteristicsOfTaxPayer>
        <listTest>
            <nodeMappings type="newNode">
                <name>primaryKey</name>
                <type>derived</type>
                <derivedValue>1</derivedValue>
            </nodeMappings>
            <nodeMappings type="newNode">
                <name>value</name>
                <type>derived</type>
                <derivedValue>test1</derivedValue>
            </nodeMappings>
        </listTest>
        <listTest>
            <nodeMappings type="newNode">
                <name>primaryKey</name>
                <type>derived</type>
                <derivedValue>2</derivedValue>
            </nodeMappings>
            <nodeMappings type="newNode">
                <name>value</name>
                <type>derived</type>
                <derivedValue>test2</derivedValue>
            </nodeMappings>
        </listTest>
    </input>
</root>

Setelah diproses akan terlihat seperti ini:

<root>
    <input>
        <declarationType>X</declarationType>
        <identificationNumber>5000000612</identificationNumber>
        <characteristicsOfTaxPayer>
            <collectivePerson>X</collectivePerson>
        </characteristicsOfTaxPayer>
        <listTest>
            <primaryKey>1</primaryKey>
            <primaryKey>test1</primaryKey>
        </listTest>
        <listTest>
            <primaryKey>2</primaryKey>
            <primaryKey>test2</primaryKey>
        </listTest>
    </input>
</root>

Apakah ada cara yang lebih baik untuk melakukan ini?

1
Cronas De Se 13 Mei 2021, 16:08

1 menjawab

Jawaban Terbaik

Pekerjaan lengkap dapat dilakukan dengan xslt sederhana.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  
  <xsl:output method="xml" encoding="utf-8" indent="yes"/>
  
  <!-- Identity template : copy all text nodes, elements and attributes -->   
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="nodeMappings[@type='newNode']" >
    <xsl:element name="{name/text()}"><xsl:value-of select="derivedValue/text()"/></xsl:element>
  </xsl:template>

</xsl:stylesheet>

Jika benar ada satu pengecualian dalam konvensi: bahwa elemen nama nilai teks menjadi elemen yang baru dibuat, yaitu <name>value</name> menjadi <primaryKey/> maka xslt akan menjadi:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  
  <xsl:output method="xml" encoding="utf-8" indent="yes"/>
  
  <!-- Identity template : copy all text nodes, elements and attributes -->   
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="nodeMappings[@type='newNode']" >
    <xsl:element name="{name/text()}"><xsl:value-of select="derivedValue/text()"/></xsl:element>
  </xsl:template>

  <xsl:template match="nodeMappings[@type='newNode'][name='value']" >
    <primaryKey><xsl:value-of select="derivedValue/text()"/></primaryKey>
  </xsl:template>

</xsl:stylesheet>
0
Siebe Jongebloed 13 Mei 2021, 13:40