2015-06-19 59 views
0

我想請閱讀 Java中的XML文件,然後更新該文件中的某些元素具有新值。我的文件大於200mb,性能很重要,所以DOM模型不能使用。Java修改XML

我覺得一個STAX解析器是解決方案,但沒有像樣的文學使用Java STAX到讀書寫字 XML回到同一文件。

(僅供參考我一直在使用the java tutorialthis helpful tutorial得到什麼我到目前爲止)我使用的Java 7

,但似乎並沒有是因爲XML解析API的任何更新.. 。很久以前。所以這可能不相關。

目前我有這樣的:

public static String readValueFromXML(final File xmlFile, final String value) throws FileNotFoundException, XMLStreamException 
{ 
    XMLEventReader reader = new XMLInputFactory.newFactory().createXMLEventReader(new FileReader(xmlFile)); 

    String found = ""; 
    boolean read = false; 

    while (reader.hasNext()) 
    { 
     XMLEvent event = reader.nextEvent(); 
     if (event.isStartElement() && 
      event.asStartElement().getName().getLocalPart().equals(value)) 
     { 
      read = true; 
     } 

     if (event.isCharacters() && read) 
     { 
      found = event.asCharacters().getData(); 
      break; 
     } 
    } 

    return found; 
} 

這將讀取XMLFILE並返回所選元素的值。但是,我有另一種方法updateXMLFile(final File xmlFile, final String value),我想與此結合使用。

所以我的問題有三個方面:

  1. 是否有STAX實現了編輯XML
  2. 威爾的XPath是任何幫助嗎?沒有將我的文件轉換爲Document可以使用嗎?
  3. (更普遍的)爲什麼不是Java有一個更好的XML API?
+0

可以使用STAX作家。並寫下你剛剛讀到的內容。您應該寫入不同的文件,然後刪除原始文件並重命名臨時文件。 – talex

+0

不會寫入新文件涉及將原始內容中的每個元素讀入內存? – Rossiar

+0

是的。但這是不可避免的。你需要找到一個地方在哪裏編輯。 – talex

回答

0

這是我的方法,其內容使用StAX從文件事件,並將其寫入到另一個文件。當循環遍歷正確命名的元素時,值會更新。

public void read(String key, String value) 
    { 
     try (FileReader fReader = new FileReader(inputFile); FileWriter fWriter = new FileWriter(outputFile)) 
     { 
      XMLEventFactory factory = XMLEventFactory.newInstance(); 
      XMLEventReader reader = XMLInputFactory.newFactory().createXMLEventReader(fReader); 
      XMLEventWriter writer = XMLOutputFactory.newFactory().createXMLEventWriter(fWriter); 

      while (reader.hasNext()) 
      { 
       XMLEvent event = reader.nextEvent(); 
       boolean update = false; 

       if (event.isStartElement() && event.asStartElement().getName().getLocalPart().equals(key)) 
       { 
         update = true; 
       } 
       else if (event.isCharacters() && update) 
       { 
         Characters characters = factory.createCharacters(value); 
         event = characters; 
         update = false; 
       } 
       writer.add(event); 
      } 
     } 
     catch (XMLStreamException | FactoryConfigurationError | IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 
1

有你可能想看看兩件事情。首先是使用JAXB將XML綁定到POJO,然後您可以隨意使用,並在需要時將結構序列化回XML。

第二個是XML JDBC驅動程序,有幾個提供收費的,不知道是否有任何開源的人或沒有。根據我的經驗,JAXB是更好的選擇。如果XML文件太大而無法高效處理JAXB我認爲您需要查看使用數據庫作爲XML文件的替代品。

+0

我不能將我的實現從XML更改爲數據庫,JAXB是一個不錯的主意,但涉及太多的開銷讓我煩惱。 – Rossiar