Java/XML/DOM Action
Содержание
Access Document type
<source lang="java">
import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; 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.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class TryDOM implements ErrorHandler {
public static void main(String args[]) throws Exception { DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); builderFactory.setNamespaceAware(true); builderFactory.setValidating(true); builderFactory.setIgnoringElementContentWhitespace(true); DocumentBuilder builder = null; builder = builderFactory.newDocumentBuilder(); builder.setErrorHandler(new TryDOM()); Document xmlDoc = builder.parse(new File("y.xml")); DocumentType doctype = xmlDoc.getDoctype(); System.out.println("DOCTYPE node:\n" + getDoctypeString(doctype)); listNodes(xmlDoc.getDocumentElement(), ""); } private static String getDoctypeString(DocumentType doctype) { String str = doctype.getName(); StringBuffer doctypeStr = new StringBuffer("<!DOCTYPE ").append(str); final char QUOTE = "\""; if ((str = doctype.getSystemId()) != null) doctypeStr.append(" SYSTEM ").append(QUOTE).append(str).append(QUOTE); else if ((str = doctype.getPublicId()) != null) // Check for a public ID doctypeStr.append(" PUBLIC ").append(QUOTE).append(str).append(QUOTE); if ((str = doctype.getInternalSubset()) != null) doctypeStr.append("[").append(str).append("]"); return doctypeStr.append(">").toString(); // Append ">", return the string } static void listNodes(Node node, String indent) { String nodeName = node.getNodeName(); System.out.println(indent + nodeName + " Node, type is " + node.getClass().getName() + ":"); System.out.println(node); if (node instanceof Element && node.hasAttributes()) { NamedNodeMap attrs = node.getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Attr attribute = (Attr) attrs.item(i); System.out.println(indent + attribute.getName() + "=" + attribute.getValue()); } } NodeList list = node.getChildNodes(); if (list.getLength() > 0) { System.out.println(indent + "Child Nodes of " + nodeName + " are:"); for (int i = 0; i < list.getLength(); i++) listNodes(list.item(i), indent + " "); } } public void fatalError(SAXParseException spe) throws SAXException { System.out.println("Fatal error at line " + spe.getLineNumber()); System.out.println(spe.getMessage()); throw spe; } public void warning(SAXParseException spe) { System.out.println("Warning at line " + spe.getLineNumber()); System.out.println(spe.getMessage()); } public void error(SAXParseException spe) { System.out.println("Error at line " + spe.getLineNumber()); System.out.println(spe.getMessage()); }
} <?xml version="1.0"?> <!DOCTYPE circle [
<!ELEMENT circle (position)> <!ATTLIST circle radius CDATA #REQUIRED > <!ELEMENT position EMPTY> <!ATTLIST position x CDATA #REQUIRED y CDATA #REQUIRED >
]> <circle radius="15">
<position x="30" y="50"/>
</circle>
</source>
Custom complex filters for selecting nodes
<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; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.NodeIterator; public class Main {
public static void main(String[] argv) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder loader = factory.newDocumentBuilder(); Document document = loader.parse("sample.xml"); DocumentTraversal traversal = (DocumentTraversal) document; NodeIterator iterator = traversal.createNodeIterator(document.getDocumentElement(), NodeFilter.SHOW_ALL, new ItemFilter(), true); for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { System.out.println("Element: " + ((Element) n).getTagName()); } } private static final class ItemFilter implements NodeFilter { public short acceptNode(Node n) { if (n instanceof Element) { if (((Element) n).getTagName().equals("item")) { return NodeFilter.FILTER_ACCEPT; } } return NodeFilter.FILTER_REJECT; } }
}
</source>
DOM parser with all its actions displayed
<source lang="java">
import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; 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.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class MainClass implements ErrorHandler {
public static void main(String args[]) throws Exception { DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); builderFactory.setNamespaceAware(true); builderFactory.setValidating(true); DocumentBuilder builder = null; builder = builderFactory.newDocumentBuilder(); builder.setErrorHandler(new MainClass()); Document xmlDoc = null; xmlDoc = builder.parse(new File("y.xml")); listNodes(xmlDoc); } static void listNodes(Node node) { String nodeName = node.getNodeName(); if (node instanceof Element) { if (node.hasAttributes()) { NamedNodeMap attrs = node.getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Attr attribute = (Attr) attrs.item(i); // Get an attribute System.out.println(" "+ attribute.getName()+ "="+attribute.getValue()); } } System.out.println(indent + "<" + nodeName + ">"); } else if (node instanceof Text) { System.out.println(((Text) node).getData()); } else if (node instanceof DocumentType) { System.out.println(getDoctypeString((DocumentType) node)); } indent.append(" "); NodeList list = node.getChildNodes(); if (list.getLength() > 0) { for (int i = 0; i < list.getLength(); i++) { listNodes(list.item(i)); } } System.out.println("</" + nodeName + ">"); } public void fatalError(SAXParseException spe) throws SAXException { System.out.println("Fatal error at line " + spe.getLineNumber()); System.out.println(spe.getMessage()); throw spe; } public void warning(SAXParseException spe) { System.out.println("Warning at line " + spe.getLineNumber()); System.out.println(spe.getMessage()); } public void error(SAXParseException spe) { System.out.println("Error at line " + spe.getLineNumber()); System.out.println(spe.getMessage()); } static StringBuffer indent = new StringBuffer(""); private static String getDoctypeString(DocumentType doctype) { String str = doctype.getName(); StringBuffer doctypeStr = new StringBuffer("<!DOCTYPE ").append(str); if ((str = doctype.getSystemId()) != null) { doctypeStr.append(" SYSTEM ").append("\"").append(str).append("\""); } if ((str = doctype.getPublicId()) != null) { doctypeStr.append(" PUBLIC ").append("\"").append(str).append("\""); } if ((str = doctype.getInternalSubset()) != null) { doctypeStr.append("[").append(str).append("]"); } return doctypeStr.append(">").toString(); }
}
</source>
DOM Utilities
<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; import org.w3c.dom.NodeList; import org.w3c.dom.Text; public class TestDOM {
public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = factory.newDocumentBuilder(); Document document = parser.parse("zooinventory.xml"); Element inventory = document.getDocumentElement(); NodeList animals = inventory.getElementsByTagName("Animal"); System.out.println("Animals = "); for (int i = 0; i < animals.getLength(); i++) { String name = DOMUtil.getSimpleElementText((Element) animals.item(i), "Name"); String species = DOMUtil.getSimpleElementText((Element) animals.item(i), "Species"); System.out.println(" " + name + " (" + species + ")"); } Element foodRecipe = DOMUtil.getFirstElement((Element) animals.item(1), "FoodRecipe"); String name = DOMUtil.getSimpleElementText(foodRecipe, "Name"); System.out.println("Recipe = " + name); NodeList ingredients = foodRecipe.getElementsByTagName("Ingredient"); for (int i = 0; i < ingredients.getLength(); i++) System.out.println(" " + DOMUtil.getSimpleElementText((Element) ingredients.item(i))); }
} class DOMUtil {
public static Element getFirstElement(Element element, String name) { NodeList nl = element.getElementsByTagName(name); if (nl.getLength() < 1) throw new RuntimeException("Element: " + element + " does not contain: " + name); return (Element) nl.item(0); } public static String getSimpleElementText(Element node, String name) { Element namedElement = getFirstElement(node, name); return getSimpleElementText(namedElement); } public static String getSimpleElementText(Element node) { StringBuffer sb = new StringBuffer(); NodeList children = node.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if (child instanceof Text) sb.append(child.getNodeValue()); } return sb.toString(); }
} //File: zooinventory.xml /*<?xml version="1.0" encoding="UTF-8"?> <Element2>
<Element3 animalClass="mammal"> <Name>A</Name> <Species>B</Species> <Habitat>C</Habitat> <Food>D</Food> <Temperament>E</Temperament> <Weight>1</Weight> </Element3> <Element3 animalClass="mammal"> <Name>F</Name> <Species>G</Species> <Habitat>H</Habitat> <ElementA> <Name>I</Name> <Ingredient>I1</Ingredient> <Ingredient>I2</Ingredient> <Ingredient>I2</Ingredient> </ElementA> <Temperament>J</Temperament> <Weight>4</Weight> </Element3>
</Element2>
- /
</source>