DomXmlDtdValidation.java - DOM Parser with DTD Validation

Q

How to parse an XML file with DTD validation using the DOM API?

✍: FYIcenter

A

if you want to parse an XML file with DTD validation using the DOM API, you can follow these suggestions:

1. Set the validation flag to true on DocumentBuilderFactory object:

      DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
    f.setValidating(Boolean.parseBoolean(args[1]));
      DocumentBuilder b = f.newDocumentBuilder();

2. Provide the XML file with DTD included, UserError.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) 2017 FYIcenter.com -->
<!DOCTYPE User [
   <!ELEMENT User (ID+, BirthDate+, Name+, Sex+)>
   <!ELEMENT ID (#PCDATA)>
   <!ELEMENT BirthDate (#PCDATA)>
   <!ELEMENT Name (#PCDATA)>
   <!ELEMENT Sex (#PCDATA)>
]>

<User>
    <ID>101</ID>
    <Name>Frank Y. Ivy</Name>
</User>

Here is a complete example of parsing an XML with DTD validation using SAX API, SaxXmlDtdValidation.java:

// Copyright (c) 2017 FYIcenter.com
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class DomXmlDtdValidation {
   static String dot = "............................................................";
   public static void main(String[] args) throws Exception {
      DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
    f.setValidating(Boolean.parseBoolean(args[1]));
      DocumentBuilder b = f.newDocumentBuilder();
      Document d = b.parse(new File(args[0]));
      System.out.println("Implementation class:\n   "+d.getClass().getName());

      System.out.println("DOM object elements and text contents:");
    Node n = d.getDocumentElement();
    printText(n, 1);
   }
   public static void printText(Node n, int l) {
      String v = "";
      if (n.getNodeType()==Node.TEXT_NODE) v = n.getTextContent();
      System.out.println(dot.substring(0,l)+n.getNodeName()+":"+v);
    NodeList c = n.getChildNodes();
    for (int i=0; i<c.getLength(); i++) {
       printText(c.item(i),l+1);
    }
   }
}

Compile and run the example program, DomXmlSerializer.java:

>\fyicenter\jdk-1.8.0\bin\javac DomXmlDtdValidation.java

>\fyicenter\jdk-1.8.0\bin\java DomXmlDtdValidation UserError.xml true

Warning: validation was turned on but an org.xml.sax.ErrorHandler was not set, w
hich is probably not what is desired.  Parser will use a default ErrorHandler to
 print the first 0  errors.  Please call the setErrorHandler method to fix this.

Error: URI=file:UserError.xml
Line=14: The content of element type "User" must match "(ID+,BirthDate+,Name+,Sex+)".

Implementation class:
   com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
DOM object elements and text contents:
.User:
..#text:

..ID:
...#text:101
..#text:

..Name:
...#text:Frank Y. Ivy
..#text:

If you run it again with "false", you will not see any validation errors:

>\fyicenter\jdk-1.8.0\bin\java DomXmlDtdValidation UserError.xml false

Implementation class:
   com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
DOM object elements and text contents:
.User:
..#text:

..ID:
...#text:101
..#text:

..Name:
...#text:Frank Y. Ivy
..#text:

 

DomXmlXsValidation.java - DOM Parser with XS Validation

DomXmlSerializer.java - Serialize DOM to XML String

Using XML DOM API with Apache Xerces

⇑⇑ FAQ for Apache Xerces XML Parser

2017-12-13, 1626👍, 0💬