Java/XML/DOM Action

Материал из Java эксперт
Перейти к: навигация, поиск

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>