java xml 删除项目

标签 java xml

我有一个非常简单的 xml 文件,我想创建一个简单的函数来从中删除一个项目。这是我的 xml 文件:

    <?xml version="1.0"?>
<book>
  <person>
    <name>Person 1</name>
  </person>
  <person>
    <name>Person 2</name>
  </person>
  <person>
    <name>Person 3</name>
  </person>
  <person>
    <name>Person 4</name>
  </person>
</book>

我只想调用一个方法从文件中删除一个名字。我对 XML 不是很熟悉,但确实设法创建了读取器和写入器,但现在我无法创建从文件中删除项目的方法。

当我说删除一个项目时,我的意思是:

deleteItem("Person 3");

然后 XML 文件将更改为:

<?xml version="1.0"?>
    <book>
      <person>
        <name>Person 1</name>
      </person>
      <person>
        <name>Person 2</name>
      </person>
      <person>
        <name>Person 4</name>
      </person>
    </book>

我做错了什么:

public static void removeName(String personName) throws ParserConfigurationException, IOException, SAXException{
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        Document doc = docBuilder.parse (new File("test.xml"));

        NodeList nodes = doc.getElementsByTagName("person");
        for (int i = 0; i < nodes.getLength(); i++) {       
            Element person = (Element)nodes.item(i);
            Element name = (Element)person.getElementsByTagName("name").item(0);
            String pName = name.getTextContent();
            if(pName.equals(personName)){
                person.getParentNode().removeChild(person);
            }
        }

    }

最佳答案

使用 DOM:

  public static void main(String[] args) throws Exception {
    final String xml =    "<book> " +
        "<person> " +
          "<name>Person 1</name> " +
        "</person> " +
        "<person> " +
          "<name>Person 2</name> " +
        "</person> " +
        "<person> " +
          "<name>Person 3</name> " +
        "</person> " +
        "<person> " +
          "<name>Person 4</name> " +
        "</person> " +
      "</book>";

      DocumentBuilderFactory dbf =
          DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();
      InputSource is = new InputSource();
      is.setCharacterStream(new StringReader(xml));

      Document doc = db.parse(is);
      deletePerson(doc, "Person 3");
      printXML(doc);
  }

  public static void deletePerson(Document doc, String personName) {
    // <person>
    NodeList nodes = doc.getElementsByTagName("person");

    for (int i = 0; i < nodes.getLength(); i++) {
      Element person = (Element)nodes.item(i);
      // <name>
      Element name = (Element)person.getElementsByTagName("name").item(0);
      String pName = name.getTextContent();
      if (pName.equals(personName)) {
         person.getParentNode().removeChild(person);
      }
    }
  }

  public static void printXML(Document doc) 
  throws TransformerException {
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");

    StreamResult result = new StreamResult(new StringWriter());
    DOMSource source = new DOMSource(doc);
    transformer.transform(source, result);

    String xmlString = result.getWriter().toString();
    System.out.println(xmlString);
  }

关于java xml 删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7029427/

相关文章:

java - 在伦敦地铁上进行网络检测

java - 带有 JavaME 的 org.json 在 toString() 中插入随机数

xml - XSLT 中如何输出当前元素路径?

javascript - 剥离表格内容

mysql - 如何将存储在 XML 文件中的数据转换成关系数据库(MySQL)?

java.lang.RuntimeException : Unable to instantiate activity ComponentInfo - NFC access 错误

java - Autowire 的 Spring Bean 覆盖问题 'byType'

java - 你能让一个对象在运行时可序列化吗?

android - EditText 高度-长度

xml - 什么是 : or n1: in this xslt stylesheet do?