2017-06-29 146 views
0

如何從java中的XML文檔中刪除XML標記?如何從java中的XML文檔中刪除XML標記

例如,我有以下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> 

我想刪除從XML價格標籤,併產生以如下方式的XML:

<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> 

另外的要求是這樣XML標籤就可以隨着我從Web服務獲取這些信息而改變,這可以改變它發送的信息。

+1

寫自己的解析器,爲此目的將需要大約最多10分鐘 –

+0

您想使用哪種模式? DOM,OM,JAXB還是自定義分析器? –

+1

我不建議爲XML編寫自己的解析器,因爲它比你想象的更復雜。但是,如果您真的處理嚴格限制的XML配置文件,那麼這樣做可能有意義。我自己,我傾向於用XSLT轉換做這種工作。 Java支持XSLT,所需的轉換將非常簡單。 –

回答

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); 

    } 
} 

根類:

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; 

} 

項目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; 
} 

我希望這將有助於。

0

如上所述,請考慮運行Identity Transform的XSLT以及要刪除的節點上的空模板。否for循環,if邏輯,或使用此解決方案所需的數據結構(例如,數組列表,hashmaps)。

作爲信息,XSLT是一種專用語言(與XPath同級),旨在將xml文件轉換爲其他xml,html甚至文本文件(csv/txt)。諸如Java,PHP,Python和其他語言的通用語言使庫運行XSLT 1.0腳本,甚至可以調用像libxslt/Saxon這樣的外部專用XSLT處理器。另外,XSLT腳本本身也是格式良好的XML文件,可以根據任何動態需求從文件或字符串進行解析。

XSLT(另存爲的.xsl腳本從文件中下面的Java解析)

<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); 
    } 
} 
相關問題