2012-06-11 53 views
1

我使用標準Java DOM解析器來處理文件 -Java的如何獲取存儲在完整的XML修改DOM文檔

我已經處理了它,並更改了XML文檔的XML,現在我想查看修改xml。 如何將修改的XML存儲到字符串變量中。

import java.io.*; 
import org.w3c.dom.*; 
import javax.xml.parsers.*; 

import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.stream.StreamResult; 

class SaveDom 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><config><var-def name=\"initial_no\">3972971</var-def><var-def name=\"webpage\">asdf</var-def><cloudwhile condition=\"${i.toInt() != 500}\" index=\"i\" returnvalue=\"false\" indexstart=\"1\" upperbound=\"500\"><var-def name=\"webpage\" overwrite=\"true\"><cloudwhile condition=\"${i.toInt() != 500}\" index=\"i\" returnvalue=\"false\" indexstart=\"100\" upperbound=\"700\"></cloudwhile><try><body><http url=\"www.google.com/patents/US${initial_no.toInt()+i.toInt()}\"/></body><catch>ERROR- No content found for this patent number.</catch></try></var-def><file action=\"write\" path=\"data/${initial_no.toInt()+i.toInt()}_content.html\"><var name=\"webpage\"/></file></cloudwhile></config>"; 
     InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8")); 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(is); 

     // Write out the xml file 
     // Use a Transformer for output 
     TransformerFactory tFactory = TransformerFactory.newInstance(); 
     Transformer transformer = tFactory.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty("encoding", "UTF-8"); 

     DOMSource source = new DOMSource(doc); 
     java.io.StringWriter sw = new java.io.StringWriter(); 
     StreamResult _result = new StreamResult(sw); 
     transformer.transform(source, _result); 
     String out = sw.toString(); 
     System.out.println(out); 
    } 
} 

回答

1

您可以使用Transformer的API來完成你想要什麼給該文件一旦你操縱了它。以下是向第一個孩子添加屬性的示例。

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Attr; 
import org.w3c.dom.Document; 
import org.w3c.dom.NamedNodeMap; 
import org.xml.sax.SAXException; 

public class XmlExample { 

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException { 
     String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><config><var-def name=\"initial_no\">3972971</var-def><var-def name=\"webpage\">asdf</var-def><cloudwhile condition=\"${i.toInt() != 500}\" index=\"i\" returnvalue=\"false\" indexstart=\"1\" upperbound=\"500\"><var-def name=\"webpage\" overwrite=\"true\"><cloudwhile condition=\"${i.toInt() != 500}\" index=\"i\" returnvalue=\"false\" indexstart=\"100\" upperbound=\"700\"></cloudwhile><try><body><http url=\"www.google.com/patents/US${initial_no.toInt()+i.toInt()}\"/></body><catch>ERROR- No content found for this patent number.</catch></try></var-def><file action=\"write\" path=\"data/${initial_no.toInt()+i.toInt()}_content.html\"><var name=\"webpage\"/></file></cloudwhile></config>"; 
     InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8")); 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(is); 

     // Example processing: Add an attribute to first child 
     NamedNodeMap attributes = doc.getFirstChild().getAttributes(); 
     Attr attribute = doc.createAttribute("joes-attribute"); 
     attribute.setValue("joes-value"); 
     attributes.setNamedItem(attribute); 

     // Use a Transformer to output to whatever you want. 
     TransformerFactory tFactory = 
      TransformerFactory.newInstance(); 
     Transformer transformer = tFactory.newTransformer(); 

     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(System.out); 
     transformer.transform(source, result); 
    } 
} 

你可以閱讀更多關於它:http://www.petefreitag.com/item/445.cfm

1

您可以使用一個變壓器輸出:

供您參考,我使用的代碼below--

 str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><config><var-def name=\"initial_no\">3972971</var-def><var-def name=\"webpage\">asdf</var-def><cloudwhile condition=\"${i.toInt() != 500}\" index=\"i\" returnvalue=\"false\" indexstart=\"1\" upperbound=\"500\"><var-def name=\"webpage\" overwrite=\"true\"><cloudwhile condition=\"${i.toInt() != 500}\" index=\"i\" returnvalue=\"false\" indexstart=\"100\" upperbound=\"700\"></cloudwhile><try><body><http url=\"www.google.com/patents/US${initial_no.toInt()+i.toInt()}\"/></body><catch>ERROR- No content found for this patent number.</catch></try></var-def><file action=\"write\" path=\"data/${initial_no.toInt()+i.toInt()}_content.html\"><var name=\"webpage\"/></file></cloudwhile></config>"; 
     InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8")); 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(is); 
        //some processing.. 
相關問題