在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