Java XML教程 - Java DOM编辑
属性
以下代码显示如何向元素添加属性。
import java.io.StringWriter; 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.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Main { public static void main(String[] argv) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); DOMImplementation impl = builder.getDOMImplementation(); Document doc = impl.createDocument(null, null, null); Element e1 = doc.createElement("api"); doc.appendChild(e1); Element e2 = doc.createElement("java"); e1.appendChild(e2); e2.setAttribute("url", "http://www.www.w3cschool.cn"); //transform the DOM for showing the result in console DOMSource domSource = new DOMSource(doc); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StringWriter sw = new StringWriter(); StreamResult sr = new StreamResult(sw); transformer.transform(domSource, sr); System.out.println(sw.toString()); } }
上面的代码生成以下结果。
复制属性
public void dupAttributes(Document doc) { Element root = doc.getDocumentElement(); Element personOne = (Element)root.getFirstChild(); Element personTwo = (Element)personOne.getNextSibling(); Element personThree = (Element)personTwo.getNextSibling(); Attr deptAttr = personOne.getAttributeNode("dept"); personOne.removeAttributeNode(deptAttr); String deptString = deptAttr.getValue(); personTwo.setAttribute("dept",deptString); personThree.setAttribute("dept",deptString); String mailString = personOne.getAttribute("mail"); personTwo.setAttribute("mail",mailString); String titleString = personOne.getAttribute("title"); personOne.removeAttribute("title"); personThree.setAttribute("title",titleString); }
删除两个属性
public void delAttribute(Document doc) { Element root = doc.getDocumentElement(); Element person = (Element)root.getFirstChild(); person.removeAttribute("extension"); person.removeAttribute("dept"); }
元素
import java.io.StringWriter; 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.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Node; public class Main { public static void main(String[] argv) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); DOMImplementation impl = builder.getDOMImplementation(); Document doc = impl.createDocument(null, null, null); Node root = doc.createElement("A"); doc.appendChild(root); Node stanza = doc.createElement("B"); root.appendChild(stanza); Node line = doc.createElement("C"); stanza.appendChild(line); line.appendChild(doc.createTextNode("test")); line = doc.createElement("Line"); stanza.appendChild(line); line.appendChild(doc.createTextNode("test")); //transform the DOM for showing the result in console DOMSource domSource = new DOMSource(doc); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StringWriter sw = new StringWriter(); StreamResult sr = new StreamResult(sw); transformer.transform(domSource, sr); System.out.println(sw.toString()); } }
上面的代码生成以下结果。
以下代码显示如何从父代删除元素。
public void deleteFirstElement(Document doc) { Element root = doc.getDocumentElement(); Element child = (Element)root.getFirstChild(); root.removeChild(child); }
文本节点
以下代码显示如何向元素添加文本节点。
import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.bootstrap.DOMImplementationRegistry; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSSerializer; public class Main { public static void main(String[] argv) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Element root = doc.createElementNS(null, "person"); // Create Root Element Element item = doc.createElementNS(null, "name"); // Create element item.appendChild(doc.createTextNode("Jeff")); root.appendChild(item); // Attach element to Root element item = doc.createElementNS(null, "age"); // Create another Element item.appendChild(doc.createTextNode("28")); root.appendChild(item); // Attach Element to previous element down tree item = doc.createElementNS(null, "height"); item.appendChild(doc.createTextNode("1.80")); root.appendChild(item); // Attach another Element - grandaugther doc.appendChild(root); // Add Root to Document DOMImplementationRegistry registry = DOMImplementationRegistry .newInstance(); DOMImplementationLS domImplLS = (DOMImplementationLS) registry .getDOMImplementation("LS"); LSSerializer ser = domImplLS.createLSSerializer(); // Create a serializer // for the DOM LSOutput out = domImplLS.createLSOutput(); StringWriter stringOut = new StringWriter(); // Writer will be a String out.setCharacterStream(stringOut); ser.write(doc, out); // Serialize the DOM System.out.println("STRXML = " + stringOut.toString()); // DOM as a String } }
上面的代码生成以下结果。
以下代码显示了如何通过插入和替换编辑文本。
public void edit3(Document doc) { int count; int offset; Element root = doc.getDocumentElement(); Element place = (Element)root.getFirstChild(); Text name = (Text)place.getFirstChild().getFirstChild(); Text directions = (Text)place.getLastChild().getFirstChild(); offset = 7; name.insertData(offset," black"); offset = 5; count = 4; directions.replaceData(offset,count,"right"); }
通过剪切和粘贴修改文本
public void edit(Document doc) { int length; int count; int offset; Element root = doc.getDocumentElement(); Element place = (Element)root.getFirstChild(); Text name = (Text)place.getFirstChild().getFirstChild(); Text directions = (Text)place.getLastChild().getFirstChild(); length = name.getLength(); count = 4; offset = length - 4; name.deleteData(offset,count); length = directions.getLength(); count = 6; offset = length - count; String bridge = directions.substringData(offset,count); name.appendData(bridge); count = 5; offset = 4; directions.deleteData(offset,count); }
通过替换修改文本
public void edit(Document doc) { Element root = doc.getDocumentElement(); Element place = (Element)root.getFirstChild(); Text name = (Text)place.getFirstChild().getFirstChild(); Text directions = (Text)place.getLastChild().getFirstChild(); name.setData("AAA"); directions.setData("BBB"); }
注释
以下代码显示如何为XML创建注释节点。
import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Comment; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Main { public static void main(String[] argv) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); factory.setExpandEntityReferences(false); Document doc = factory.newDocumentBuilder().parse(new File("filename")); Element element = doc.getDocumentElement(); Comment comment = doc.createComment("A Document Comment"); element.getParentNode().insertBefore(comment, element); } }
处理指令
下面的代码显示了如何添加ProcessingInstruction。
public void addProcessingInstruction(Document doc) { Element root = doc.getDocumentElement(); Element folks = (Element)root.getLastChild(); ProcessingInstruction pi; pi = (ProcessingInstruction)doc.createProcessingInstruction( "validate", "phone=\"lookup\""); root.insertBefore(pi,folks); }
CDATA
以下代码显示如何添加CDATA到XML文档。
public void addCDATA(Document doc) { Element root = doc.getDocumentElement(); Element place = (Element)root.getFirstChild(); Element directions = (Element)place.getLastChild(); String dirtext = ">>>\n" + "<<<\n" + "&&&\n" + "<><><>."; CDATASection dirdata = doc.createCDATASection(dirtext); directions.replaceChild(dirdata,directions.getFirstChild()); }
克隆
public void duplicatePerson(Document doc) { Element root = doc.getDocumentElement(); Element origPerson = (Element)root.getFirstChild(); Element newPerson = (Element)origPerson.cloneNode(true); root.appendChild(newPerson); }