Java/XML/DOM Action
Версия от 18:01, 31 мая 2010; (обсуждение)
Содержание
Access Document type
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>
Custom complex filters for selecting nodes
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;
}
}
}
DOM parser with all its actions displayed
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();
}
}
DOM Utilities
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>
*/