Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / August 2007

Tip: Looking for answers? Try searching our database.

Validating XML with an external DTD

Thread view: 
salimk786 - 04 Aug 2007 01:49 GMT
Hello,

I need help validating an xml file against an external DTD. The below
code allows me to read the xml file and gather specific elements of
interest.

If the xml looked like this, How would i validate it ?
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<simpsons type='bank' platform='TV' app-version='1.0.0'>
    <header>
        <id>845314490</id>
        <title>IN_SF_EN_MA_G2_CA_2009_00</title>
    </header>
    <font-table>
        <font-entry number='1'>
            <charset>ansi</charset>
            <name>Arial</name>
            <pitch>default</pitch>
        </font-entry>
        <font-entry number='2'>
            <charset>ansi</charset>
            <name>Times New Roman</name>
            <pitch>variable</pitch>
            <family>roman</family>
        </font-entry>
    </font-table>
    ....
</simpsons>

Thanks.

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class ParseXml extends DefaultHandler{

    private SAXParserFactory spf;
    private Examview tempExamviewObj;    //to maintain context

    private List myExamviewArrayList;

    private String tempVal;
    private String filename;

    public ParseXml(){
        this.myExamviewArrayList = new ArrayList();
    }
    public Iterator getExamviewIterator(){
        return myExamviewArrayList.iterator();
    }
    public void parse(String filename) {
        this.filename = filename;
        parseDocument(filename);
    }
    private void parseDocument(String filename) {

        //get a factory
        this.spf = SAXParserFactory.newInstance();
        try {

            //get a new instance of parser
            SAXParser sp = this.spf.newSAXParser();

            //parse the file and also register this class for call backs
            sp.parse(filename, this);

        }catch(SAXException se) {
            se.printStackTrace();
        }catch(ParserConfigurationException pce) {
            pce.printStackTrace();
        }catch (IOException ie) {
            ie.printStackTrace();
        }
    }

    //Event Handlers
    public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
        //reset
        tempVal = "";
        if(qName.equalsIgnoreCase("examview")) {
            //create a new instance of Examview
            tempExamviewObj = new Examview();
            tempExamviewObj.setPlatform(attributes.getValue("platform"));
            tempExamviewObj.setAppVersion(attributes.getValue("app-version"));
        }
    }

    public void characters(char[] ch, int start, int length) throws
SAXException {
        tempVal = new String(ch,start,length);
    }

    public void endElement(String uri, String localName, String qName)
throws SAXException {

        if(qName.equalsIgnoreCase("Examview")) {
            tempExamviewObj.setFileName(this.filename);

            //add it to the list
            myExamviewArrayList.add(tempExamviewObj);

        }else if (qName.equalsIgnoreCase("id")) {
            tempExamviewObj.setId(tempVal);
        }else if (qName.equalsIgnoreCase("title")) {
            tempExamviewObj.setTitle(tempVal);
        }else if (qName.equalsIgnoreCase("topic")) {
            //System.out.println("Topic:" + tempVal.trim());
            tempExamviewObj.addTopic(tempVal);
        }else if (qName.equalsIgnoreCase("question")) {
            tempExamviewObj.updateQuestionCount();
        }

    }
}
Arne Vajhøj - 04 Aug 2007 02:18 GMT
> I need help validating an xml file against an external DTD. The below
> code allows me to read the xml file and gather specific elements of
> interest.

I believe that to validate a XML file against a DTD, then you XML file
needs to refer to the DTD - your app can only map from the name used to
a physical location.

You can specify a location of a schema and validate against that
purely in your code.

Arne
salimk786 - 04 Aug 2007 02:36 GMT
On Aug 3, 6:18 pm, Arne Vajh?j <a...@vajhoej.dk> wrote:
> > I need help validating an xml file against an external DTD. The below
> > code allows me to read the xml file and gather specific elements of
[quoted text clipped - 8 lines]
>
> Arne

I don't have any control over the XML file (i.e. where the dtd
references, or whether it is
a standalone=yes/no document). All I am given is the xml you see
above. I have a simpsons.dtd file which i would like use to validate
the xmls against. I just don't know how to do this.

Thanks
Arne Vajhøj - 04 Aug 2007 02:42 GMT
>>> I need help validating an xml file against an external DTD. The below
>>> code allows me to read the xml file and gather specific elements of
[quoted text clipped - 11 lines]
> above. I have a simpsons.dtd file which i would like use to validate
> the xmls against. I just don't know how to do this.

You could sneak a DTD declaration into the stream
you give to the parser via a wrapper class.

Arne
salimk786 - 04 Aug 2007 02:52 GMT
On Aug 3, 6:42 pm, Arne Vajh?j <a...@vajhoej.dk> wrote:
> > On Aug 3, 6:18 pm, Arne Vajh?j <a...@vajhoej.dk> wrote:
> >>> I need help validating an xml file against an external DTD. The below
[quoted text clipped - 17 lines]
>
> Arne

Hello Arne,

Okay, a wrapper class, so how would i do this ? Can you give me some
direction please. I'm still learning java. Much appreciated.

Thanks.
Arne Vajhøj - 04 Aug 2007 04:01 GMT
> Okay, a wrapper class, so how would i do this ? Can you give me some
> direction please. I'm still learning java. Much appreciated.

The following is far from product quality but it should give
you an idea:

Document doc = db.parse(new FakeInputStream("C:\\medarbejder_nodtd.xml",
"<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"no\"?>\r\n",
"<!DOCTYPE medarbejderliste SYSTEM \"medarbejder.dtd\">\r\n"));

where:

class FakeInputStream extends InputStream {
    private static final int F = 1;
    private static final int X = 2;
    private static final int D = 3;
    private InputStream f;
    private InputStream x;
    private InputStream d;
    private int mode;
    public FakeInputStream(String xmlfnm, String xmldecl, String
doctyp) throws IOException {
        f = new FileInputStream(xmlfnm);
        while(f.read() != '\n');
        x = new ByteArrayInputStream(xmldecl.getBytes());
        d = new ByteArrayInputStream(doctyp.getBytes());
        mode = X;
    }
    public int read() throws IOException {
        int c = -1;
        switch(mode) {
        case X:
            c = x.read();
            if(c < 0) {
                mode = D;
                c = d.read();
            }
            break;
        case F:
            c = f.read();
            break;
        case D:
            c = d.read();
            if(c < 0) {
                mode = F;
                c = f.read();
            }
            break;
        }
        return c;
    }
}

Arne
Twisted - 04 Aug 2007 04:07 GMT
On Aug 3, 11:01 pm, Arne Vajh?j <a...@vajhoej.dk> wrote:
>      public int read() throws IOException {
>          int c = -1;
[quoted text clipped - 4 lines]
>                  mode = D;
>                  c = d.read();
                  if (c < 0) {
                      mode = F
                      c = f.read();
                  }
>              }
>              break;
[quoted text clipped - 11 lines]
>          return c;
>      }

Should not blow up if the DTD string is empty this way. :) (It already
looks to throw IOException and NPE eagerly on failure)
Steven Simpson - 04 Aug 2007 09:56 GMT
> If the xml looked like this, How would i validate it ?
> <?xml version='1.0' encoding='utf-8' standalone='yes'?>
> <simpsons type='bank' platform='TV' app-version='1.0.0'>
>  

Could EntityResolver2.getExternalSubset(String, String) help?:

<http://java.sun.com/javase/6/docs/api/org/xml/sax/ext/EntityResolver2.html#getEx
ternalSubset(java.lang.String,%20java.lang.String
)>

Signature

ss at comp dot lancs dot ac dot uk                                     |

Roedy Green - 04 Aug 2007 13:01 GMT
>I need help validating an xml file against an external DTD.
see http://mindprod.com/jgloss/xml.html
Signature

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.