在Java中从XML文件中删除节点

我必须根据这些节点的子元素中的值从XML文件中删除一个节点。 实际文件如下:

    EDI_DC40 132 001 620 30 1 4 INVOIC02 /AMS/OBRXINVOIC02 INVOIC SAPABI LS ABIPRR3132 XIS LS LS BREEDI0001 20110406 071233 20110406071232   BRL BRL 1.00000 Z171 INVO 0969286361 2949.090 3329.780 KGM ZLR 0001061877 L  00449 7.688 001 000000 V1 55 20110406 20110406 034335 0.00 0.00 0.00 2200.90- 28757.95 28186.49 28186.49 X 000423391    RS 0001061877 BR P BRSANTOSRO5 BRN1   1B 0000899500 L6 BRN1 KA CAR FL Matriz Dia Sao Paulo BR P SP PT   1C 0000899499 L5 BRN1 KA Car FL Matriz Dia Sao Paulo BR P SP PT   1D 0002766603 L4 BRN1 KA Car Dia Rio de Janeiro 22775-112 BR P RJ PT   SS 0000899472 L3 BRN1 KA Carrefour Sao Paulo BR P SP PT   SS 0000021177 AMS View Vevey CH E Sociedade VD EN   1G 0000021174 Global View Vevey CH E Sociedade VD EN   AG 0001061877 Dia Brasil Sociedade Ltda R Agricola La Paz Tristante SN Osasco 06276-035 BR 11 38868131 P Pq Industrial Anhanguera SP 7899288907049 PT   SS 0001061877 Dia Brasil Sociedade Ltda R Agricola La Paz Tristante SN Osasco 06276-035 BR 11 38868131 P Pq Industrial Anhanguera SP 7899288907049 PT  03476811021159 492.488.462.119    RG 0000658366 Carrefour Com e Industria Ltda Av das Americas 5150 Rio de Janeiro 22640-102 BR 21 4313011 21 3252624 P Barra da Tijuca RJ 7891103001024 PT  45543915000262 81536600    TF 0100301696 Transportadora Nosei Ltda Rua Carlos Weber 512 Sao Paulo 05303-000 BR 11 38329460 11 38329460 P Vila Leopoldina SP PT  54043435000142 111173871116    BK BR10 Nestle Brasil Ltda Av Dr Chucri Zaidan 246 Sao Paulo SP 04583-110 BR 11 55084400 11 55085475 Vila Cordeiro SP  7891000001004    001 813763 20110404   024 20110406   002 CIF Custo, Seguro e Frete   BR 3565689 BANCO ABN AMRO REAL S A S#o Paulo 5704752   BR 00191893 Banco Do Brasil S A Sao Paulo 331415   BR 00193070 BANCO DO BRASIL S A São Paulo 331415   BR 47901 BANKBOSTON BANCO MULTIPLO SA Sao Paulo 89821   BR 23722372 BANCO BRADESCO S A São Paulo 4617   BR 1040988 Caixa Economica Federal Sao Paulo 30001500   BR 74551 Banco Citibank S A Sao Paulo 1002058   BR 3999454 HSBC Bank Brasil S A-Banco Multiplo Sao Paulo 4425   BR 3417912 Banco Itau S A Sao Paulo 1445   BR 34172938 Banco Itau S A Sao Paulo 82   BR 1511935 Banco Nossa Caixa S A Sao Paulo 4100342   BR 03372271 BANCO DO ESTADO DE SAO PAULO SA BANESPA Sao Paulo 13001181-7   BR 4090352 Unibanco Uniao De Bancos Brasileiros S A Sao Paulo 102049   Z018 P PT  "O dest.deverá,nas operações com merc ou prest de serv receb c imposto *   retido,escrit o doc fiscal nos termos art 278 do RICMS".    Z019 P PT  VENDAS COM CONDIÇÃO CIF *    008 BRN1   007 06   006 00   015 F2   003 BR10   011 28186.49 BRL   010 24332.15 BRL  

我的要求是,如果其子元素“PARVW”带有值“SS”,我想从文件中删除整个段“E1EDKA1”。 在我的情况下,我想删除PARVW将作为SS的3段“E1EDKA1”

我尝试过:我的代码如下:

 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(fis); NodeList nList = doc.getElementsByTagName("E1EDKA1"); System.out.println(nList.getLength()); if (nList != null && nList.getLength() > 0) { for (int i = 0; i < nList.getLength();i++) { Node node = nList.item(i); // System.out.println(node); Element e = (Element) node; NodeList nodeList = e.getElementsByTagName("PARVW"); String title = nodeList.item(0).getChildNodes().item(0).getNodeValue(); System.out.println(title); if (title.equals("SS")) { System.out.println("Test"); doc.getFirstChild().removeChild(node); } TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File("C:/Users/ssourav/Desktop/Idoc12_out123.xml")); transformer.transform(source, result); 

请帮助我获取此输出并建议我代码中的问题在哪里。 实际上程序在遇到第一个“SS”值时就会退出,并且没有任何内容写入输出文件。

如果没有写任何内容,我认为你得到了例外。 你没有追踪它吗?

尝试以这种方式删除节点: e.getParentNode().removeChild(e);

  XPath path = XPathFactory.newInstance().newXPath(); NodeList nl = (NodeList) path.evaluate("*/E1EDKA1[PARVW/text()='SS']", doc, XPathConstants.NODESET); for (int i = 0; i < nl.getLength(); i++) { nl.item(i).getParentNode().removeChild(nl.item(i)); } 

你可以这样做,

  void removeElement(Document docObj) { NodeList records= doc.getElementsByTagName("EDI_DC40"); Element record= null; //iterate over all records for(int i=0; i