2015-11-15 50 views
0

一個XML文件,我有以下XML文件:編輯在java中

<Tables> 
    <table> 
     <row></row> 
    </table> 
<Tables> 

,我想將它編輯到:

<Tables> 
    <table> 
     <row>some value</row> 
    </table> 
<Tables> 

我使用文件作家寫的XML文件。我如何編輯它?

我發現我創建的臨時文件包含編輯,然後刪除原始文件並重命名臨時文件。有沒有其他方法?

這是我的代碼寫入文件:

public boolean createTable(String path, String name, String[] properties) throws IOException { 
    FileWriter writer = new FileWriter(path); 
    writer.write("<Tables>"); 
    writer.write("\t<" + name + ">"); 
    for(int i=0; i<properties.length; i++){ 
     writer.write("\t\t<" + properties[0] + "></" + properties[0] + ">"); 
    } 
    writer.write("\t</" + name + ">"); 
    writer.write("</Tables>"); 
    writer.close(); 
    return false; 
} 
+1

我看不出有任何的Java這裏。你是否試圖使用Java寫入XML文件?顯示一些代碼。 – Tdorno

+1

將Java代碼添加到問題中。 –

+0

@Tdorno我把我的代碼 –

回答

1

如果您的XML是靜態的,你可以利用這一點,這裏的input.xml是您的xml文件

File file = new File("input.xml"); 
byte[] data; 
try (FileInputStream fis = new FileInputStream(file)) { 
    data = new byte[(int) file.length()]; 
    fis.read(data); 
} 
String input = new String(data, "UTF-8"); 
String tag = "<row>"; 
String newXML = input.substring(0, input.indexOf(tag) + tag.length()) + "your value" + input.substring(input.indexOf(tag) + tag.length(), input.length()); 
try (FileWriter fw = new FileWriter(file)) { 
    fw.write(newXML); 
} 
System.out.println("XML Updated"); 
+0

,但我想編輯XML文件以後使用它 –

3

不要讀寫XML自己。 Java配套提供了多個API的爲您解析和生成XML,這需要所有編碼的關懷和逃避的問題:

  • DOM XML被加載到一個樹形結構的記憶。
  • SAX XML作爲一系列事件處理。這是一個推式解析器,解析器爲每個事件調用您的代碼。
  • StAX將XML讀作一系列事件/令牌。這是一個拉分析器,您的代碼將調用解析器來獲取下一個值。

您還可以找到許多用於解析XML的第三方庫,而Java本身也支持將XML編組到XML POJO。

就你而言,我建議DOM,因爲它最容易使用。不要將DOM用於巨大的XML文件,因爲它會將整個文件加載到內存中。對於大文件,我建議使用StAX。

除了編碼問題之外,使用XML解析器將使得代碼不易受到輸入中的微小變化的影響,例如,下面的3個空的row元素意味着相同。抑或是row元素甚至是空的,以及如何擺脫現有的內容就像所示:

<!-- row is empty --> 
<row></row> 
<row/> 
<row /> 

<!-- row has content --> 
<row>5 + 7 &lt; 10</row> 
<row><![CDATA[5 + 7 < 10]]></row> 
<row><condition expr="5 + 7 &lt; 10"></row> 

使用DOM:

// Load XML from file 
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder domBuilder = domFactory.newDocumentBuilder(); 
Document document = domBuilder.parse(file); 

// Modify DOM tree (simple version) 
NodeList rowNodes = document.getElementsByTagName("row"); 
for (int i = 0; i < rowNodes.getLength(); i++) { 
    Node rowNode = rowNodes.item(i); 

    // Remove existing content (if any) 
    while (rowNode.getFirstChild() != null) 
     rowNode.removeChild(rowNode.getFirstChild()); 

    // Add text content 
    rowNode.appendChild(document.createTextNode("some value")); 
} 

// Save XML to file 
TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
transformer.transform(new DOMSource(document), 
         new StreamResult(file)); 
+0

謝謝你的澄清 –