微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何高效地使用Java修改庞大XML的一小部分

如何解决如何高效地使用Java修改庞大XML的一小部分

我需要读取一个大约 1MB 的巨大 XML 文件并只修改其中的一小部分,而不需要对整个 XML 文件进行封送处理。 示例:

<student id = "10">
    <age>11</age>
    <name>Tom</name>
    <address>Address Line 1</address>
    <phone>1234567890</phone>
    <city>NY</city>
    <zip>567890</zip>
    <postal>12345</postal>
</student>

从上面的 XML 中,我只想读取地址元素并更新,其他元素保持原样。 所以上面的XML应该变成:

<student id = "10">
    <age>11</age>
    <name>Tom</name>
    <address>Updated Address</address>
    <phone>1234567890</phone>
    <city>NY</city>
    <zip>567890</zip>
    <postal>12345</postal>
</student>

但是,我在 XML 之下丢失了其他元素:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<student>
    <address>Updated Address</address>
</student>

我正在尝试使用带有以下代码的 JAXB:

 // we need a blank document to store final xml output                    
  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();       
  DocumentBuilder docBuilder = dbf.newDocumentBuilder();                   
  Document document = docBuilder.parse("student.xml");                     
                                                                           
  // create JAXBContext which will be used to create a Binder              
  JAXBContext jc = JAXBContext.newInstance(Student.class);                 
                                                                           
  Binder<Node> binder = jc.createBinder();                                 
                                                                           
  // set output as formatted one                                           
  binder.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);              
                                                                           
  // get xml node from the document                                        
  Node xmlNode = document.getDocumentElement();                            
                                                                           
  // Returns the updated JAXB object                                       
  Student st = (Student) binder.updateJAXB(xmlNode);                       
                                                                           
  //Update Address                    
  st.setAddress("Updated Address");                                                  
                                                                           
  // update xml node with new data                                         
  xmlNode = binder.updateXML(st);                                          
                                                                           
  // set node value to the document                                        
  document.setNodeValue(xmlNode.getNodeValue());                           
                                                                           
  // finally print the edited object on stdout                             
  TransformerFactory tf = TransformerFactory.newInstance();                
  Transformer t = tf.newTransformer();                                     
  t.transform(new DOMSource(document),new StreamResult(System.out)); 

@XmlRootElement
public class Student{

    public String getAddress() {
        return address;
    }
    @XmlElement
    public void setAddress(String address) {
        this.address = address;
    }

    String address;
   
}

 

可以使用哪种 Java 解析机制来实现这一点?还有哪一种在内存和时间方面更有效?

解决方法

如今,一兆字节并不是很大。确实,用于这项工作的最简单且非常有效的工具是 XSLT。使用 XSLT 3.0,它非常接近单行(加上一些样板):

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="student[@id='10']/address/text()">Updated address</xsl:template>
</xsl:transform>

在我看来,对于这个任务,JAXB 似乎引入了很多不必要的复杂性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?