Java Tutorial/XML/DOM Edit
Содержание
- 1 Adding a New Entry to the End of a List
- 2 A Method for Inserting a New Entry in a List
- 3 Changing the Name of a DOM Element
- 4 Create Document with root QName
- 5 Create New Container
- 6 Creating an XML Document from a DOM Tree
- 7 Deleting an Attribute
- 8 Deleting a Tree Node
- 9 Duplicating a Portion of the Tree
- 10 Editing by Using a Document Fragment: Creating a DocumentFragment Subtree and Appending to the Document
- 11 Editing the Text of a Node
- 12 Edit Text by Insertion and Replacement
- 13 Inserting a CDATASection Node
- 14 Inserting a Processing Instruction and Comment
- 15 Locating a Node and Modifying Text
- 16 Locating a Node by an ID
- 17 Locating a Node by Using Siblings
- 18 Locating Elements by Tag Name
- 19 Methods to Insert a Processing Instruction and a Comment
- 20 Modifying Text by Cutting and Pasting
- 21 Moving and Copying Attributes
- 22 Moving Nodes between Documents: Copy a Node from One Parse Tree into Another
- 23 Normalize All of the Text in a Document
- 24 Replacing a Tree Node: Replacing an Existing Node with a New One
- 25 Setting an Attribute
- 26 Start a new XML Document
Adding a New Entry to the End of a List
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); append(doc, "newName", "1111111111", "newEmail"); write(doc); } catch (Exception e) { System.err.println(e); } } public static void append(Document doc, String name, String phone, String email) { Element personNode = doc.createElement("person"); Element nameNode = doc.createElement("name"); personNode.appendChild(nameNode); Text nametextNode = doc.createTextNode(name); nameNode.appendChild(nametextNode); Element phoneNode = doc.createElement("phone"); personNode.appendChild(phoneNode); Text phonetextNode = doc.createTextNode(phone); phoneNode.appendChild(phonetextNode); Element emailNode = doc.createElement("email"); personNode.appendChild(emailNode); Text emailtextNode = doc.createTextNode(email); emailNode.appendChild(emailtextNode); Element root = doc.getDocumentElement(); root.appendChild(personNode); } private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData()); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <folks>
<person> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
<?xml version="1.0" standalone="yes"?> <folks> <person> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> <person> <name> newName </name> <phone> 1111111111 </phone> <email> newEmail </email> </person> </folks>
A Method for Inserting a New Entry in a List
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); insert(doc, "newName", "1111111111", "newEmail"); write(doc); } catch (Exception e) { System.err.println(e); } } public static void insert(Document doc, String name, String phone, String email) { Element personNode = doc.createElement("person"); Element nameNode = doc.createElement("name"); personNode.appendChild(nameNode); Text nametextNode = doc.createTextNode(name); nameNode.appendChild(nametextNode); Element phoneNode = doc.createElement("phone"); personNode.appendChild(phoneNode); Text phonetextNode = doc.createTextNode(phone); phoneNode.appendChild(phonetextNode); Element emailNode = doc.createElement("email"); personNode.appendChild(emailNode); Text emailtextNode = doc.createTextNode(email); emailNode.appendChild(emailtextNode); Element root = doc.getDocumentElement(); Node firstChildNode = root.getFirstChild(); root.insertBefore(personNode, firstChildNode); } private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData()); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}</source>
<?xml version="1.0" standalone="yes"?> <folks> <person> <name> newName </name> <phone> 1111111111 </phone> <email> newEmail </email> </person> <person> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> </folks>
Changing the Name of a DOM Element
<source lang="java">
import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; 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(); Element element2 = doc.createElement("newname"); NamedNodeMap attrs = element.getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Attr attr2 = (Attr) doc.importNode(attrs.item(i), true); element2.getAttributes().setNamedItem(attr2); } while (element.hasChildNodes()) { element2.appendChild(element.getFirstChild()); } element.getParentNode().replaceChild(element2, element); }
}</source>
Create Document with root QName
<source lang="java">
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common * Development and Distribution License("CDDL") (collectively, the * "License"). You may not use this file except in compliance with the * License. You can obtain a copy of the License at * http://www.netbeans.org/cddl-gplv2.html * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the * specific language governing permissions and limitations under the * License. When distributing the software, include this License Header * Notice in each file and include the License file at * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the GPL Version 2 section of the License file that * accompanied this code. If applicable, add the following below the * License Header, with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * Contributor(s): * * The Original Software is NetBeans. The Initial Developer of the Original * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun * Microsystems, Inc. All Rights Reserved. * * If you wish your version of this file to be governed by only the CDDL * or only the GPL Version 2, indicate your decision by adding * "[Contributor] elects to include this software in this distribution * under the [CDDL or GPL Version 2] license." If you do not indicate a * single choice of license, a recipient has the option to distribute * your version of this file under either the CDDL, the GPL Version 2 or * to extend the choice of license to its licensees as provided above. * However, if you add GPL Version 2 code and therefore, elected the GPL * Version 2 license, then the option applies only if the new code is * made subject to such option by the copyright holder. */
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.DOMException; import org.w3c.dom.Document; /**
* Utility class collecting library methods related to XML processing. Stolen * from nbbuild/antsrc and openide/.../xml. * * @author Petr Kuzel, Jesse Glick */
public final class XMLUtil {
public static Document createDocument(String rootQName) throws DOMException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { return factory.newDocumentBuilder ().getDOMImplementation ().createDocument (null, rootQName, null); } catch (ParserConfigurationException ex) { throw (DOMException)new DOMException(DOMException.NOT_SUPPORTED_ERR, "Cannot create parser").initCause(ex); // NOI18N } }
}</source>
Create New Container
<source lang="java">
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /*******************************************************************************
* Copyright (C) 2007 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. ******************************************************************************/
/**
* Various XML utilities. * * @author simonjsmith, ksim * @version 1.1 - ksim - March 6th, 2007 - Added functions regarding streaming * @version 1.2 - ksim - March 10th, 2007 - Added functions regarding DOM * manipulation */
public class Utils {
public static Element createNewContainer(Document document, Element parent, String childElement) { Element child = (Element) document.createElement(childElement); parent.appendChild(child); return child; }
}</source>
Creating an XML Document from a DOM Tree
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMCopy {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); write(doc); } catch (Exception e) { System.err.println(e); } } private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <folks>
<person> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
<?xml version="1.0" standalone="yes"?> <folks> <person> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> </folks>
Deleting an Attribute
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); delAttribute(doc); write(doc); } catch (Exception e) { System.err.println(e); } }
public static void delAttribute(Document doc) { Element root = doc.getDocumentElement(); Element person = (Element)root.getFirstChild(); person.removeAttribute("number"); person.removeAttribute("dept"); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ATTLIST person number CDATA #IMPLIED
dept CDATA "staff">
]> <folks>
<person number="3412" dept="medical"> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
<?xml version="1.0" standalone="yes"?> <folks> <person dept="staff"> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> </folks>
Deleting a Tree Node
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); deleteFirstElement(doc); write(doc); } catch (Exception e) { System.err.println(e); } } public static void deleteFirstElement(Document doc) { Element root = doc.getDocumentElement(); Element child = (Element)root.getFirstChild(); root.removeChild(child); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData()); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <folks>
<person> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
Duplicating a Portion of the Tree
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); duplicatePerson(doc); write(doc); } catch (Exception e) { System.err.println(e); } } public static void duplicatePerson(Document doc) { Element root = doc.getDocumentElement(); Element origPerson = (Element)root.getFirstChild(); Element newPerson = (Element)origPerson.cloneNode(true); root.appendChild(newPerson); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <folks>
<person> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
<?xml version="1.0" standalone="yes"?> <folks> <person> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> <person> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> </folks>
Editing by Using a Document Fragment: Creating a DocumentFragment Subtree and Appending to the Document
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentFragment; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); addFragment(doc); write(doc); } catch (Exception e) { System.err.println(e); } } public static void addFragment(Document doc) { Element person; Element root = doc.getDocumentElement(); DocumentFragment fragment = doc.createDocumentFragment(); person = makePersonNode(doc,"Name 1","555-4444"); fragment.appendChild(person); person = makePersonNode(doc,"Name 2","555-9999"); fragment.appendChild(person); root.appendChild(fragment); } private static Element makePersonNode(Document doc,String name,String phone) { Element nameNode = doc.createElement("name"); Text nametextNode = doc.createTextNode(name); nameNode.appendChild(nametextNode); Element phoneNode = doc.createElement("phone"); Text phonetextNode = doc.createTextNode(phone); phoneNode.appendChild(phonetextNode); Element personNode = doc.createElement("person"); personNode.appendChild(nameNode); personNode.appendChild(phoneNode); return(personNode); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: persionWithDTD.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE locations [ <!ELEMENT locations (place)*> <!ELEMENT place (name | directions)*> <!ELEMENT name (#PCDATA)> <!ELEMENT directions (#PCDATA)> ]> <locations>
<place> <name>oldName</name> <directions>oldDirection</directions> </place>
</locations></source>
<?xml version="1.0" standalone="yes"?> <locations> <place> <name> oldName </name> <directions> oldDirection </directions> </place> <person> <name> Fred </name> <phone> 555-4927 </phone> </person> <person> <name> Sam </name> <phone> 555-9832 </phone> </person> </locations>
Editing the Text of a Node
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); modifyTextByReplacement(doc); write(doc); } catch (Exception e) { System.err.println(e); } }
public static void modifyTextByReplacement(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("newName"); directions.setData("newDirection"); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}</source>
<?xml version="1.0" standalone="yes"?> <locations> <place> <name> newName </name> <directions> newDirection </directions> </place> </locations>
Edit Text by Insertion and Replacement
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); editTextbyInsertionandReplacement(doc); write(doc); } catch (Exception e) { System.err.println(e); } }
public static void editTextbyInsertionandReplacement(Document doc) { Element root = doc.getDocumentElement(); Element place = (Element)root.getFirstChild(); Text name = (Text)place.getFirstChild().getFirstChild(); Text directions = (Text)place.getLastChild().getFirstChild(); // Inserting the word "black"
// name.insertData(offset," black");
name.insertData(3," black"); // Replace "left" with "right" //directions.replaceData(offset,count,"right"); directions.replaceData(3,3,"right"); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE locations [ <!ELEMENT locations (place)*> <!ELEMENT place (name | directions)*> <!ELEMENT name (#PCDATA)> <!ELEMENT directions (#PCDATA)> ]> <locations>
<place> <name>name</name> <directions>direction</directions> </place>
</locations></source>
<?xml version="1.0" standalone="yes"?> <locations> <place> <name> old blackName </name> <directions> oldrightection </directions> </place> </locations>
Inserting a CDATASection Node
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); addCDATA(doc); write(doc); } catch (Exception e) { System.err.println(e); } }
public static void addCDATA(Document doc) { Element root = doc.getDocumentElement(); Element place = (Element)root.getFirstChild(); Element directions = (Element)place.getLastChild(); String dirtext = "cdData."; CDATASection dirdata = doc.createCDATASection(dirtext); directions.replaceChild(dirdata,directions.getFirstChild()); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: personWithDTD.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE locations [ <!ELEMENT locations (place)*> <!ELEMENT place (name | directions)*> <!ELEMENT name (#PCDATA)> <!ELEMENT directions (#PCDATA)> ]> <locations>
<place> <name>name</name> <directions>direction</directions> </place>
</locations></source>
<?xml version="1.0" standalone="yes"?> <locations> <place> <name> oldName </name> <directions> </directions> </place> </locations>
Inserting a Processing Instruction and Comment
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentFragment; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); addComment(doc); write(doc); } catch (Exception e) { System.err.println(e); } } public static void addComment(Document doc) { Element root = doc.getDocumentElement(); Element folks = (Element)root.getLastChild(); Comment comment = doc.createComment("Text of the comment"); root.insertBefore(comment,folks); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: persionWithDTD.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE locations [ <!ELEMENT locations (place)*> <!ELEMENT place (name | directions)*> <!ELEMENT name (#PCDATA)> <!ELEMENT directions (#PCDATA)> ]> <locations>
<place> <name>oldName</name> <directions>oldDirection</directions> </place>
</locations></source>
<?xml version="1.0" standalone="yes"?> <locations> <!-- Text of the comment --> <place> <name> oldName </name> <directions> oldDirection </directions> </place> </locations>
Locating a Node and Modifying Text
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); newEmail(doc, "B D", "newEmail"); write(doc); } catch (Exception e) { System.err.println(e); } } public static void newEmail(Document doc,String newname,String newemail) { Element root = doc.getDocumentElement(); NodeList rootlist = root.getChildNodes(); for(int i=0; i<rootlist.getLength(); i++) { Element person = (Element)rootlist.item(i); NodeList personlist = person.getChildNodes(); Element name = (Element)personlist.item(0); NodeList namelist = name.getChildNodes(); Text nametext = (Text)namelist.item(0); String oldname = nametext.getData(); if(oldname.equals(newname)) { Element email = (Element)personlist.item(1); NodeList emaillist = email.getChildNodes(); Text emailtext = (Text)emaillist.item(0); emailtext.setData(newemail); } }
}
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData()); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <folks>
<person> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
<?xml version="1.0" standalone="yes"?> <folks> <person> <name> B D </name> <phone> newEmail </phone> <email> b@xyz.net </email> </person> </folks>
Locating a Node by an ID
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); findByID(doc, "B"); write(doc); } catch (Exception e) { System.err.println(e); } }
public static void findByID(Document doc,String idName) { Element name = doc.getElementById(idName); if(name == null) { System.out.println("There is no element with the ID " + idName); } else { Text text = (Text)name.getFirstChild(); System.out.println("The ID " + idName + " locates the name " + text.getData()); } }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}</source>
The ID B locates the name BB
Locating a Node by Using Siblings
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); newEmail(doc, "B D", "newEmail"); write(doc); } catch (Exception e) { System.err.println(e); } } public static void newEmail(Document doc, String newname, String newemail) { Element root = doc.getDocumentElement(); Element person = (Element) root.getFirstChild(); while (person != null) { Element name = (Element) person.getFirstChild(); Text nametext = (Text) name.getFirstChild(); String oldname = nametext.getData(); if (oldname.equals(newname)) { Element email = (Element) name.getNextSibling(); Text emailtext = (Text) email.getFirstChild(); emailtext.setData(newemail); } person = (Element) person.getNextSibling(); } } private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData()); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <folks>
<person> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
Locating Elements by Tag Name
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); makeNamelist(doc); write(doc); } catch (Exception e) { System.err.println(e); } } private static void makeNamelist(Document doc) { String names = null; Element root = doc.getDocumentElement(); NodeList nameElements = root.getElementsByTagName("name"); for(int i=0; i<nameElements.getLength(); i++) { Element name = (Element)nameElements.item(i); Text nametext = (Text)name.getFirstChild(); if(names == null){ names = nametext.getData(); }else{ names += ", " + nametext.getData(); } } Element namelist = doc.createElement("names"); Text namelisttext = doc.createTextNode(names); namelist.appendChild(namelisttext); root.insertBefore(namelist,root.getFirstChild());
}
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <folks>
<person> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
<?xml version="1.0" standalone="yes"?> <folks> <names> B D </names> <person> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> </folks>
Methods to Insert a Processing Instruction and a Comment
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentFragment; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); addProcessingInstruction(doc); write(doc); } catch (Exception e) { System.err.println(e); } }
public static 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); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: persionWithDTD.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE locations [ <!ELEMENT locations (place)*> <!ELEMENT place (name | directions)*> <!ELEMENT name (#PCDATA)> <!ELEMENT directions (#PCDATA)> ]> <locations>
<place> <name>oldName</name> <directions>oldDirection</directions> </place>
</locations></source>
<?xml version="1.0" standalone="yes"?> <locations> <?validate phone="lookup"?> <place> <name> oldName </name> <directions> oldDirection </directions> </place> </locations>
Modifying Text by Cutting and Pasting
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); modifyingTextbyCuttingandPasting(doc); write(doc); } catch (Exception e) { System.err.println(e); } }
public static void modifyingTextbyCuttingandPasting(Document doc) { Element root = doc.getDocumentElement(); Element place = (Element)root.getFirstChild(); Text name = (Text)place.getFirstChild().getFirstChild(); Text directions = (Text)place.getLastChild().getFirstChild();
// name.deleteData(offset,count);
name.deleteData(2,3); //String bridge = directions.substringData(offset,count); String bridge = directions.substringData(2,3); name.appendData(bridge); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE locations [ <!ELEMENT locations (place)*> <!ELEMENT place (name | directions)*> <!ELEMENT name (#PCDATA)> <!ELEMENT directions (#PCDATA)> ]> <locations>
<place> <name>name</name> <directions>direction</directions> </place>
</locations></source>
<?xml version="1.0" standalone="yes"?> <locations> <place> <name> olmedDi </name> <directions> oldDirection </directions> </place> </locations>
Moving and Copying Attributes
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); dupAttributes(doc); write(doc); } catch (Exception e) { System.err.println(e); } }
public static void dupAttributes(Document doc) { Element root = doc.getDocumentElement(); Element personOne = (Element)root.getFirstChild(); Attr deptAttr = personOne.getAttributeNode("dept"); personOne.removeAttributeNode(deptAttr); String deptString = deptAttr.getValue(); personOne.setAttribute("dept",deptString+" updated"); String mailString = personOne.getAttribute("mail"); personOne.setAttribute("mail",mailString+" updated"); String titleString = personOne.getAttribute("title"); //personOne.removeAttribute("title"); personOne.setAttribute("title",titleString+" updated");
}
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: personDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ATTLIST person number CDATA #IMPLIED
dept CDATA #IMPLIED mail CDATA #IMPLIED title CDATA #IMPLIED>
]> <folks>
<person number="3412" dept="medical" mail="mailValue" title="titleValue"> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
<?xml version="1.0" standalone="yes"?> <folks> <person dept="medical updated" mail="mailValue updated" number="3412" title="titleValue updated"> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> </folks>
Moving Nodes between Documents: Copy a Node from One Parse Tree into Another
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); importName(doc, doc); write(doc); } catch (Exception e) { System.err.println(e); } } public static void importName(Document doc1,Document doc2) { Element root1 = doc1.getDocumentElement(); Element personInDoc1 = (Element)root1.getFirstChild(); Node importedPerson = doc2.importNode(personInDoc1,true); Element root2 = doc2.getDocumentElement(); root2.appendChild(importedPerson); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData()); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: persionWithDTD.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE locations [ <!ELEMENT locations (place)*> <!ELEMENT place (name | directions)*> <!ELEMENT name (#PCDATA)> <!ELEMENT directions (#PCDATA)> ]> <locations>
<place> <name>oldName</name> <directions>oldDirection</directions> </place>
</locations></source>
<?xml version="1.0" standalone="yes"?> <locations> <place> <name> oldName </name> <directions> oldDirection </directions> </place> <place> <name> oldName </name> <directions> oldDirection </directions> </place> </locations>
Normalize All of the Text in a Document
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); normalize(doc); write(doc); } catch (Exception e) { System.err.println(e); } }
public static void normalize(Document doc) { Element root = doc.getDocumentElement(); root.normalize(); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
} //File: personWithDTD.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE locations [ <!ELEMENT locations (place)*> <!ELEMENT place (name | directions)*> <!ELEMENT name (#PCDATA)> <!ELEMENT directions (#PCDATA)> ]> <locations>
<place> <name>name</name> <directions>direction</directions> </place>
</locations></source>
Replacing a Tree Node: Replacing an Existing Node with a New One
<source lang="java">
/* Code revised from Java, XML, and JAXP by Arthur Griffith John Wiley & Sons 2002
- /
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); replacePerson(doc,"newName","111111","newEmail@email.ru"); write(doc); } catch (Exception e) { System.err.println(e); } } public static void replacePerson(Document doc, String name, String phone, String email) { Element newPersonNode = doc.createElement("person"); Element nameNode = doc.createElement("name"); newPersonNode.appendChild(nameNode); Text nametextNode = doc.createTextNode(name); nameNode.appendChild(nametextNode); Element phoneNode = doc.createElement("phone"); newPersonNode.appendChild(phoneNode); Text phonetextNode = doc.createTextNode(phone); phoneNode.appendChild(phonetextNode); Element emailNode = doc.createElement("email"); newPersonNode.appendChild(emailNode); Text emailtextNode = doc.createTextNode(email); emailNode.appendChild(emailtextNode); Element root = doc.getDocumentElement(); Element oldPersonNode = (Element) root.getFirstChild(); root.replaceChild(newPersonNode, oldPersonNode); } private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData()); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <folks>
<person> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
Setting an Attribute
<source lang="java">
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class DOMEdit {
static public void main(String[] arg) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); dbf.setIgnoringElementContentWhitespace(true); Document doc = null; try { DocumentBuilder builder = dbf.newDocumentBuilder(); builder.setErrorHandler(new MyErrorHandler()); InputSource is = new InputSource("personWithDTD.xml"); doc = builder.parse(is); addAttribute(doc); write(doc); } catch (Exception e) { System.err.println(e); } } public static void addAttribute(Document doc) { Element root = doc.getDocumentElement(); Element person = (Element)root.getFirstChild(); person.setAttribute("company","yourCom"); }
private static final String TAB = " "; private static void write(Document doc) throws IOException { outputHeading(doc); outputElement(doc.getDocumentElement(), ""); } private static void outputHeading(Document doc) { System.out.print("<?xml version=\"1.0\""); DocumentType doctype = doc.getDoctype(); if (doctype != null) { if ((doctype.getPublicId() == null) && (doctype.getSystemId() == null)) { System.out.println(" standalone=\"yes\"?>"); } else { System.out.println(" standalone=\"no\"?>"); } } else { System.out.println("?>"); } } private static void outputElement(Element node, String indent) { System.out.print(indent + "<" + node.getTagName()); NamedNodeMap nm = node.getAttributes(); for (int i = 0; i < nm.getLength(); i++) { Attr attr = (Attr) nm.item(i); System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\""); } System.out.println(">"); NodeList list = node.getChildNodes(); for (int i = 0; i < list.getLength(); i++) outputloop(list.item(i), indent + TAB); System.out.println(indent + "</" + node.getTagName() + ">"); } private static void outputText(Text node, String indent) { System.out.println(indent + node.getData()); } private static void outputCDATASection(CDATASection node, String indent) { System.out.println(indent + node.getData() ); } private static void outputComment(Comment node, String indent) { System.out.println(indent + ""); } private static void outputProcessingInstructionNode(ProcessingInstruction node, String indent) { System.out.println(indent + "<?" + node.getTarget() + " " + node.getData() + "?>"); } private static void outputloop(Node node, String indent) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: outputElement((Element) node, indent); break; case Node.TEXT_NODE: outputText((Text) node, indent); break; case Node.CDATA_SECTION_NODE: outputCDATASection((CDATASection) node, indent); break; case Node.ruMENT_NODE: outputComment((Comment) node, indent); break; case Node.PROCESSING_INSTRUCTION_NODE: outputProcessingInstructionNode((ProcessingInstruction) node, indent); break; default: System.out.println("Unknown node type: " + node.getNodeType()); break; } }
} class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException { show("Warning", e); throw (e); } public void error(SAXParseException e) throws SAXException { show("Error", e); throw (e); } public void fatalError(SAXParseException e) throws SAXException { show("Fatal Error", e); throw (e); } private void show(String type, SAXParseException e) { System.out.println(type + ": " + e.getMessage()); System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber()); System.out.println("System ID: " + e.getSystemId()); }
}
//File: personWithDTD.xml <?xml version="1.0" standalone="yes"?>
<!DOCTYPE folks [ <!ELEMENT folks (person)*> <!ELEMENT person (name, phone, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ATTLIST person number CDATA #IMPLIED
dept CDATA "staff">
]> <folks>
<person number="3412" dept="medical"> <name>B D</name> <phone>999 555-8888</phone> <email>b@xyz.net</email> </person>
</folks></source>
<?xml version="1.0" standalone="yes"?> <folks> <person company="yourCom" dept="medical" number="3412"> <name> B D </name> <phone> 999 555-8888 </phone> <email> b@xyz.net </email> </person> </folks>
Start a new XML Document
<source lang="java">
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class Utils {
/** * Start a new XML Document. * @param rootName The name of the Document root Element (created here) * @return the Document * @throws DomException */ public static Document createXmlDocument(String rootName) { Document document = getXmlDocumentBuilder().newDocument(); Element root = document.createElement(rootName); document.appendChild(root); return document; } /** * Get a DOM Document builder. * @return The DocumentBuilder * @throws DomException */ public static DocumentBuilder getXmlDocumentBuilder() { try { DocumentBuilderFactory factory; factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(false); return factory.newDocumentBuilder(); } catch (Exception e) { } return null; }
}</source>