2016-01-22 52 views
0

我需要刪除全部OBJECT使用Java的XML文件中的TAG。我可以刪除OBJECT標記,當我輸入父標記名稱(SPAN)時直接將硬編碼導入源代碼(「span」),但我需要刪除沒有硬編碼父標記的標記。如果我使用硬編碼,則只能刪除範圍內的對象標記範圍標記。我需要刪除所有的在XML中甚至可能在另一個父代標記裏,沒有硬代碼源代碼中的Parent標記。我需要全部刪除對象標記範圍內標記和得分標記在示例XML文件中。對於示例XML文件查看下面的圖片如何從XML文件中刪除XML標記沒有硬編碼標記名稱

Java程序

public class XmlObject { 

public static void main(String[] args) { 
    String filePath = "/Users/myXml/Sample.xml"; 
    File xmlFile = new File(filePath); 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder; 
    try { 
     dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(xmlFile); 
     doc.getDocumentElement().normalize(); 
     deleteElement(doc); 
     doc.getDocumentElement().normalize(); 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File("/Users/myXml/Sample_ObjDelete.xml")); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.transform(source, result); 
     System.out.println("XML file updated successfully"); 

    } catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) { 
     e1.printStackTrace(); 
    } 
} 

private static void deleteElement(Document doc) { 
    NodeList RootElement = doc.getElementsByTagName("assessmentItem"); 

    int getRootElementLength = RootElement.getLength(); 

     System.out.println("getRootElementLength "+getRootElementLength); 

     for(int k = 0; k < getRootElementLength; k++){ 
      System.out.println("2"); 
      Node nNode = RootElement.item(0); 

      Element eElement = (Element) nNode; 
      NodeList object = eElement.getElementsByTagName("span"); 
      Element obj = null; 


    for(int i=0; i<object.getLength();i++){ 
     obj = (Element) object.item(i); 
     int leng = obj.getElementsByTagName("object").getLength(); 
      System.out.println("object:" +leng); 
      for(int j=0; j<leng;j++){ 
       Node objectNode = obj.getElementsByTagName("object").item(k); 
       (obj).removeChild(objectNode); 
      } 
    } 
    } 

} 

} 

<qualityTest> 
 
<responseDeclaration> 
 
<correctResponse> 
 
<value>QualityTest</value> 
 
</correctResponse> 
 
</responseDeclaration> 
 
<itemBody> 
 
<sampleTest> 
 
<p>Who is president of uganda?</P> 
 
<span> 
 
<object> 
 
Yoweri Museveni</object> 
 
<span> 
 
<object> 
 
Raúl Castro 
 
</Object> 
 
</span> 
 
</sampleTest> 
 
</itemBody> 
 
<score> 
 
<object> 
 
Yingluck Shinawatra 
 
</Object> 
 
</score> 
 
</qualityTest>

+0

對不起,但我真的不明白你想達到什麼!您是否需要刪除名爲span的所有XmlElements? – ParkerHalo

+0

我需要刪除XML中的對象標籤。即使它可能低於不同的父標籤。請看下面給出的圖片。 –

+0

爵士請編輯您的問題,以XML文件的內容作爲文本,而不是圖像。我們無法在圖片上測試您的代碼。 – VGR

回答

0

您可以使用XPath和XpathExpression換去跨度分數標籤

XPath xPath = XPathFactory.newInstance().newXPath(); 
String expression = "//span";   
NodeList spanNodeList = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET); 

spanNodeList將爲您提供所有跨度節點。所以你遍歷spanNodeList和刪除類似下面的代碼

for (int i = 0; i < spanNodeList .getLength(); i++) { 
      Node spanItem= spanNodeList .item(i); 

      Node parentNode = spanItem.getParentNode(); 
      parentNode.removeChild(spanItem); 
} 

和同爲span元素分數標籤也

+0

現在在這個XML文件對象是在span標籤內。但我在其他父標籤中有一些對象標籤。我該怎麼辦...? –

1

你應該遞歸走XML樹,並刪除任何對象元素的所有occurencies:

private static void deleteElement(Node someNode) { 
    NodeList childs = someNode.getChildNodes(); 
    for (int i = 0; i < childs.getLength();) { 
     Node child = childs.item(i); 
     if (child.getNodeType() == Document.ELEMENT_NODE) { 
      if (child.getNodeName().equalsIgnoreCase("object")) { 
       child.getParentNode().removeChild(child); 
       continue; 
      } else { 
       deleteElement(child); 
      } 
     } 
     i++; 
    } 
} 

這個小小的代碼片段將刪除樹中任意深度的任何名爲「object」的XML標籤。

+0

先生,你爲什麼使用(Node someNode)作爲deleteElement方法中的參數?在程序中我使用(Document doc)作爲參數。 –

+0

先生,我改變了你說的,但我得到了NULL POINTER異常。我使用節點而不是根。但是我面臨着空指針異常。 'Node node = doc.getDocumentElement(); deleteElement(節點);」我需要更改任何其他代碼。 –

+0

先生,我得到了一個解決方案。謝謝ParkerHalo。 –

0

您可以使用XPath來選擇除<object>元素以外的所有元素。例如,你可以把它放進一個名爲strip-object.xsl文件:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" omit-xml-declaration="yes"/> 
    <xsl:template match="//object"/> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

通知的第一個模板規則,不做任何處理object節點,有效地將其廢棄。第二個模板規則將對所有其他節點生效,並精確地複製它們。

要使用它,用的.xsl文件初始化變壓器:

Transformer transformer = transformerFactory.newTransformer(
    new StreamSource(new File("/Users/myXml/strip-object.xsl"))); 

如果你只是想去掉object元件來的spanscore元素的孩子,你可以改變XPath表達式:

<xsl:template match="//span/object|//score/object"/>