【问题标题】:how to copy part of an xml to another document如何将部分xml复制到另一个文档
【发布时间】:2017-04-16 07:25:12
【问题描述】:

我需要将一个 xml 读入另一个文件,并将一个元素复制到新文件中指定的次数。我如何在Java中做到这一点?例如,如果这是我要读取的 xml:

<company>
  <name> XYZ </name>
  <address> a123 </address>
  <department>
    <name> HR </name>
    <employee>
      <name>ABC</name>
      <phone> 12345 </phone>
    </employee>
  </department>
</company>

我需要将此 xml 复制到另一个文档中,其中我需要将员工节点及其所有子节点复制指定的“n”次。假设 n = 3,我的新 xml 文档将是:

<company>
  <name> XYZ </name>
  <address> a123 </address>
  <department>
    <name> HR </name>
    <employee>
      <name>ABC</name>
      <phone> 12345 </phone>
    </employee>
    <employee>
      <name>LMN</name>
      <phone> 45678 </phone>
    </employee>
    <employee>
      <name>PQR</name>
      <phone> 34567 </phone>
    </employee>
  </department>
</company>

有人可以建议合适的 java 代码来执行此操作吗?在此先感谢:)

【问题讨论】:

  • 你有没有尝试过? StackOverflow 可以帮助您解决代码中的问题,而不是让陌生人为您编写代码。
  • 我尝试使用 XML 解析器进行解析,尝试使用 node.getParentNode().insertBefore(newElement, node.getNextSibling()) 插入新节点。但我得到了 NullPointerException。虽然节点有一个值,但它返回 null。不知道为什么.. 我是使用 XML 进行 Java 编码的新手,因此没有使用或探索太多。
  • 如果您发布代码,您将获得更多帮助,找出代码有什么问题;)

标签: java xml parsing


【解决方案1】:

您可以将文件的实体表示为以下对象:

public class Employee{
     private String name;
     private String phone;
}

public class Department{
     private String name;
     private List<Employee> employees;
}

public class Company{
     private String name;
     private String address;
     private List <Department> departments;
}

然后您可以根据需要填写所有数据。要以 XML 格式写入数据,您可以使用一些 XML 序列化程序。

【讨论】:

    【解决方案2】:
    import java.io.File;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    
    public class XMLWriterDOM {
    
        public static void main(String[] args) {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder;
            try {
                dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.newDocument();
                //add elements to Document
                Element rootElement =
                    doc.createElementNS("your file path", "department");
                //append root element to document
                doc.appendChild(rootElement);
    
                //append first child element to root element
                rootElement.appendChild(getEmployee(doc, "LMN", "45678"));
    
                //append second child
                rootElement.appendChild(getEmployee(doc,"PQR", "34567"));
    
                //for output to file, console
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                //for pretty print
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                DOMSource source = new DOMSource(doc);
    
                //write to console or file
                StreamResult console = new StreamResult(System.out);
                StreamResult file = new StreamResult(new File("/Users/pankaj/emps.xml"));
    
                //write data
                transformer.transform(source, console);
                transformer.transform(source, file);
                System.out.println("DONE");
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        private static Node getEmployee(Document doc, String name, String phone) {
            Element employee = doc.createElement("employee");
    
            //create name element
            employee.appendChild(getEmployeeElements(doc, employee, "name", name));
    
            //create age element
            employee.appendChild(getEmployeeElements(doc, employee, "phone", phone));
    
            return employee;
        }
    
    
        //utility method to create text node
        private static Node getEmployeeElements(Document doc, Element element, String name, String value) {
            Element node = doc.createElement(name);
            node.appendChild(doc.createTextNode(value));
            return node;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 2011-03-03
      相关资源
      最近更新 更多