Java/XML/DOM Action

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

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>
*/