【问题标题】:How to find Node attribute value and delete it in XML with Java DOM parser如何使用 Java DOM 解析器在 XML 中查找节点属性值并将其删除
【发布时间】:2016-06-23 12:41:10
【问题描述】:

如何使用 Java DOM 解析器查找和删除项目 id="s2"?

<manifest>
    <item href="html/section1.html" id="s1" media-type="application/xhtml+xml"/>
    <item href="html/section2.html" id="s2" media-type="application/xhtml+xml"/>
    <item href="html/section3.html" id="s3" media-type="application/xhtml+xml"/>
</manifest>

我使用此代码但返回 Null

Node metadataXML = doc.getElementsByTagName("manifest").item(0);
        NodeList list = metadataXML.getChildNodes();
        for (int i = 0; i < list.getLength(); i++) {
            list.item(i).getAttributes().removeNamedItem("s2");
        }

【问题讨论】:

    标签: java dom xml-parsing


    【解决方案1】:

    看看这个答案:Removing DOM nodes when traversing a NodeList

    你必须使用类似的东西:

    Node metadataXML = doc.getElementsByTagName("manifest").item(0);
    NodeList list = metadataXML.getChildNodes();
    for (int i = 0; i < list.getLength(); i++) {
    
        Element manifestItem = (Element) list.item(i);
        if ("s2".equals(manifestItem.getAttribute("id"))) {
            metadataXML.removeChild(manifestItem);
        }
    
    }
    

    【讨论】:

    • getAttribute("id") 方法在 manifestItem 中没有。只有 getAttributes()
    • 您必须先将其转换为 Element
    • 线程“JavaFX 应用程序线程”java.lang.NullPointerException 中的异常
    【解决方案2】:

    我在this 链接评论和工作中发现了不同的方式

     NodeList nList = doc.getElementsByTagName("item");
            for (int i = 0; i < nList.getLength(); i++) {
                Node node = nList.item(i);
                if (node.getNodeType() == Element.ELEMENT_NODE) {
                    Element eElement = (Element) node;
                    System.out.println(eElement.getAttribute("id"));
                    if (eElement.getAttribute("id").equals("s" + index)) {
                        System.err.println("sdsd");
                        node.getParentNode().removeChild(node);
                    }
                }
            }
    

    【讨论】:

      【解决方案3】:

      这是在 vtd-xml 中的代码,而不是 DOM,你可以在 SO 上找到相当多的引用,甚至它自己的标签...

      import com.ximpleware.*;
      
      public class deleteNode {
          public  static  void main(String s[]) throws VTDException,java.io.UnsupportedEncodingException,java.io.IOException{
              VTDGen vg = new VTDGen();
              if (!vg.parseFile("input.xml", false))
                  return;
              VTDNav vn = vg.getNav();
              AutoPilot ap = new AutoPilot(vn);
              XMLModifier xm = new XMLModifier(vn);
              ap.selectXPath("/*/*[@id='s2']");// this is the key XPath expression
              int i=0;
              while((i=ap.evalXPath())!=-1){
      
                  xm.remove(vn.getElementFragment());// remove the node
              }
              xm.output("new.xml"); // output to a new document called new.xml
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 2016-10-01
        • 2013-05-10
        • 1970-01-01
        • 2019-02-18
        • 2012-02-26
        • 2021-09-23
        相关资源
        最近更新 更多