2017-06-29 5 views
0

Wie lösche ich XML-Tags aus XML-Dokument in Java?Wie lösche ich XML-Tags aus XML-Dokument in Java

Zum Beispiel habe ich die folgende XML:

<root> 
    <item> 
    <code>100001</code> 
    <price>456</price> 
    <name>ABC</name> 
</item> 
    <item> 
    <code>100002</code> 
    <price>123</price> 
    <name>DEF</name> 
</item> 
    <item> 
    <code>100003</code> 
    <price>887</price> 
    <name>XYZ</name> 
</item> 
</root> 

Ich möchte das Preisschild von der XML löschen und die XML auf folgende Weise erzeugen:

<root> 
     <item> 
     <code>100001</code> 
     <name>ABC</name> 
    </item> 
     <item> 
     <code>100002</code> 
     <name>DEF</name> 
    </item> 
     <item> 
     <code>100003</code> 
     <name>XYZ</name> 
    </item> 
    </root> 

Zusätzlich wird die Anforderung ist, so dass sich die XML-Tags ändern können, wenn ich diese Informationen von einem Webservice erhalte, der die von ihm gesendeten Informationen ändern kann.

+1

Ihren eigenen Parser zu diesem Zweck schriftlich würde 10 Minuten max –

+0

Welchen Modus möchten Sie verwenden? DOM, OM, JAXB oder benutzerdefinierter Parser? –

+1

Ich empfehle nicht, jemals einen eigenen Parser für XML zu schreiben, da es schwieriger ist, als Sie vielleicht denken. Wenn Sie sich jedoch mit einem stark eingeschränkten XML-Profil befassen, ist es vielleicht sinnvoll, dies zu tun. Ich selbst wäre geneigt, diese Art von Arbeit mit einer XSLT-Transformation zu machen. Java unterstützt XSLT, und die benötigte Transformation wäre ziemlich einfach. –

Antwort

1
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 
import java.io.File; 
import java.util.ArrayList; 

public class JAXBExample { 
    static Root root = new Root(); 
    public static void main(String[] args) throws JAXBException { 
     File file = new File("C:\\file.xml"); 
     File file1 = new File("C:\\result.xml"); 
     JAXBContext jaxbContext = JAXBContext.newInstance(Root.class); 

     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     Root rootEle = (Root) jaxbUnmarshaller.unmarshal(file); 

     ArrayList<item> itemList =new ArrayList<>(); 
     for (int i = 0; i < rootEle.getItemList().size() ; i++){ 
      item itemLocal = new item(); 
      itemLocal.setCode(rootEle.getItemList().get(i).getCode()); 
      itemLocal.setName(rootEle.getItemList().get(i).getName()); 
      itemList.add(itemLocal); 
     } 
     root.setItemList(itemList); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

     // output pretty printed 
     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     jaxbMarshaller.marshal(root, file1); 
     jaxbMarshaller.marshal(root, System.out); 

    } 
} 

Wurzelklasse:

import org.apache.activemq.kaha.impl.data.Item; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import java.util.ArrayList; 

@XmlRootElement(name = "root") 
public class Root { 

    public ArrayList<item> getItem() { 
     return itemList; 
    } 

    public void setItem(ArrayList<item> item) { 
     this.itemList = item; 
    } 

    private ArrayList<item> itemList; 

} 

Artikel calss:

public class item { 
    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 

     this.code = code; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    private String code; 
    private String name; 
} 

Ich hoffe, das hilft.

0

Beachten Sie XSLT, das die Identity Transform und eine leere Vorlage auf dem Knoten ausführt, den Sie entfernen möchten. No for Schleifen, if Logik oder Verwendung von Datenstrukturen (z. B. Arraylist, hashmaps) für diese Lösung benötigt.

Als Information ist XSLT eine spezielle Sprache (Geschwister zu XPath) entworfen, um XML-Dateien in andere Xml, HTML, sogar Textdateien (CSV/TXT) zu transformieren. Allgemein verwendbare Sprachen wie Java, PHP, Python und andere verwalten Bibliotheken zum Ausführen von XSLT 1.0-Skripts und können sogar externe dedizierte XSLT-Prozessoren wie libxslt/Saxon aufrufen. Darüber hinaus sind XSLT-Skripte selbst wohlgeformte XML-Dateien und können für dynamische Anforderungen aus einer Datei oder einem String analysiert werden.

XSLT(als .xsl Skript speichern aus einer Datei in Java unter analysiert werden)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

    <!-- Identity Transform --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Removes all price tags --> 
    <xsl:template match="price"/> 

</xsl:transform> 

Java

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import javax.xml.transform.*; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.transform.OutputKeys; 

import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 

import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 

public class CourseList { 
    public static void main(String[] args) throws IOException, URISyntaxException, 
                SAXException, 
                ParserConfigurationException, 
                TransformerException {  
     // LOAD XML AND XSL DOCUMENTS 
     String inputXML = "C:\\Path\\To\\Input.xml"; 
     String xslFile = "C:\\Path\\To\\XSLTScript.xsl"; 
     String outputXML = "C:\\Path\\To\\Output.xml";         

     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();    
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse (new File(inputXML)); 
     Source xslt = new StreamSource(new File(xslFile)); 

     // XSLT TRANSFORMATION WITH PRETTY PRINT 
     TransformerFactory prettyPrint = TransformerFactory.newInstance(); 
     Transformer transformer = prettyPrint.newTransformer(xslt); 

     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
     transformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); 
     transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");       

     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File(outputXML));   
     transformer.transform(source, result); 
    } 
} 
Verwandte Themen