Avatar billede mik789 Nybegynder
26. december 2005 - 09:59 Der er 23 kommentarer og
1 løsning

fra xsd til dtd

Kan XML-Spy eller andet program konvertere en xsd til en dtd automatisk?
Avatar billede arne_v Ekspert
26. december 2005 - 20:34 #1
jeg kender ingen færdige værktøjer, men man kan vel skrive noget selv

her er starten på noget i Java:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Schema2DTD {
    public static void main(String[] args) {
        try {
            MyDocument md = new MyDocument();
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File("C:\\test.xsd"));
            NodeList elms = doc.getElementsByTagName("xsd:element");
            for(int i = 0; i < elms.getLength(); i++) {
                Element elm = (Element)elms.item(i);
                String child = elm.getAttribute("name");
                for(;;) {
                    elm = (Element)elm.getParentNode();
                    if(elm == null) {
                        break;
                    }
                    if(elm.getNodeName().equals("xsd:schema")) {
                        break;
                    }
                    if(elm.getNodeName().equals("xsd:element")) {
                        String parent = elm.getAttribute("name");
                        md.addParentChild(parent, child);
                        break;
                    }
                   
                }
            }
            NodeList attrs = doc.getElementsByTagName("xsd:attribute");
            for(int i = 0; i < attrs.getLength(); i++) {
                Element attr = (Element)attrs.item(i);
                String name = attr.getAttribute("name");
                for(;;) {
                    attr = (Element)attr.getParentNode();
                    if(attr.getNodeName().equals("xsd:element")) {
                        String elm = attr.getAttribute("name");
                        md.addElementAttribute(elm, name);
                        break;
                    }
                   
                }
            }
            System.out.println(md);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

class MyDocument {
    private Map m;
    public MyDocument() {
        m = new HashMap();
    }
    public void addParentChild(String parent, String child) {
        MyElement p = (MyElement)m.get(parent);
        if(p == null) {
            p = new MyElement(parent);
            m.put(parent, p);
        }
        p.addChild(child);
        MyElement c = (MyElement)m.get(child);
        if(c == null) {
            c = new MyElement(child);
            m.put(child, c);
        }
    }
    public void addElementAttribute(String elm, String attr) {
        MyElement e = (MyElement)m.get(elm);
        if(e == null) {
            e = new MyElement(elm);
            m.put(elm, e);
        }
        e.addAttrs(attr);
    }
    public String toString() {
        StringBuffer sb = new StringBuffer();
        Iterator it = m.values().iterator();
        while(it.hasNext()) {
            sb.append(it.next());
        }
        return sb.toString();
    }
}

class MyElement {
    private String name;
    private List childs;
    private List attrs;
    public MyElement(String name) {
        this.name = name;
        childs = new ArrayList();
        attrs = new ArrayList();
    }
    public void addChild(String name) {
        childs.add(name);
    }
    public void addAttrs(String name) {
        attrs.add(name);
    }
    public String toString() {
        StringBuffer sb = new StringBuffer();
        if(childs.size() > 0) {
            sb.append("<!ELEMENT " + name + " (");
            for(int i = 0; i < childs.size(); i++) {
                if(i > 0) sb.append("|");
                sb.append(childs.get(i));
            }
            sb.append(")*>\r\n");
        } else {
            sb.append("<!ELEMENT " + name + " (#PCDATA)>\r\n");
        }
        for(int i = 0; i < attrs.size(); i++) {
            sb.append("<!ATTLIST " + name + " " + attrs.get(i) + " CDATA #IMPLIED>\r\n");
        }
        return sb.toString();
    }
}
Avatar billede mik789 Nybegynder
27. december 2005 - 08:58 #2
arne_v> jeg har så godt som ingen erfaring med java programmering - hvordan skal din kode bruges? I hvilken form skal jeg gemme den? Hvad skal jeg gøre med den i forhold til mit xsd dokument?
Avatar billede arne_v Ekspert
27. december 2005 - 14:24 #3
du gemmer som Schema2DTD.java

du retter:

Document doc = db.parse(new File("C:\\test.xsd"));

til:

Document doc = db.parse(new File(args[0]));

du compiler med:

javac Schema2DTD.java

du kører med:

java -classpath . Schema2DTD input.xsd > output.dtd
Avatar billede arne_v Ekspert
27. december 2005 - 14:25 #4
men det skal muligvis forbedres lidt - det er kun et første draft
Avatar billede mik789 Nybegynder
28. december 2005 - 09:33 #5
ok, jeg prøver mig frem
Avatar billede mik789 Nybegynder
28. december 2005 - 09:48 #6
Kørte din kode fra Kommandoprompten (Win XP). Får flg.:

Exception in thread "main" java.lang.NoClassDefFoundError: Schema2DTD
Avatar billede arne_v Ekspert
28. december 2005 - 11:41 #7
har du compilet uden fejl ?
Avatar billede mik789 Nybegynder
29. december 2005 - 08:59 #8
hvordan ser jeg det?
Avatar billede arne_v Ekspert
30. december 2005 - 23:12 #9
hvad skete der da du skrev:

javac Schema2DTD.java

?
Avatar billede mik789 Nybegynder
31. december 2005 - 09:39 #10
Prompten svarede:

'javac' blev ikke genkendt som en intern eller ekstern kommando, et program eller en batchfil.
Avatar billede arne_v Ekspert
31. december 2005 - 09:54 #11
enten har du ikke JDK installeret eller så mangler den bare i PATH

har du en javac.exe på dit system ?
Avatar billede mik789 Nybegynder
31. december 2005 - 11:40 #12
det havde jeg ikke, men det har jeg nu.

Ved javac Schema2DTD.java svares:
Note: Schema2DTD.java uses unchecked or unsafe operations.
Note: Recompile with -Xclient:unchecked for details.

Ved java -classpath . Schema2DTD input.xsd > output.dtd svares:
Exception in thread "main" java.lang.NoClassDefFoundError: Schema2DTD
Avatar billede arne_v Ekspert
31. december 2005 - 12:04 #13
mystisk

står du i samme dir ?

ligger der en Schema2DTD.class ?
Avatar billede mik789 Nybegynder
31. december 2005 - 13:37 #14
ja, der ligger en Schema2DTD.class i samme dir som Schema2DTD.java
Begge disse ligger i et andet dir end javac.exe, men jeg adresserer dem med fuld sti i javakommandoerne fra C:\Programmer\Java\jdk1.5.0_02\bin hvor javac.exe ligger
Avatar billede mik789 Nybegynder
31. december 2005 - 13:54 #15
Nu har jeg for en sikkerheds skyld kopieret filerne over i samme dir som javakommandoerne. Nu får jeg:

Exception in thread "main" java.lang.ClassCastException: com.sun.org.apache.xercers.internal.dom.DeferredDocumentImpl at Schema2DTD.main(Schema2DTD.java:50)
Avatar billede mik789 Nybegynder
01. januar 2006 - 12:52 #16
men koden skaber faktisk en dtd-fil som jeg beder den om. Den er bare tom.
Avatar billede arne_v Ekspert
01. januar 2006 - 14:51 #17
Der er et eller andet i dit schema som de kløjs i.

Kan du sende mig dit schema ?
Avatar billede mik789 Nybegynder
01. januar 2006 - 17:23 #18
Avatar billede mik789 Nybegynder
11. januar 2006 - 07:03 #19
fandt du ud af noget? ellers lad os slutte her. jeg giver gerne points for dit besvær.
Avatar billede arne_v Ekspert
17. januar 2006 - 00:37 #20
jeg fik løst cast problemet med:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Schema2DTD {
    public static void main(String[] args) {
        try {
            MyDocument md = new MyDocument();
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File("ma_bib.xsd"));
            NodeList elms = doc.getElementsByTagName("xsd:element");
            for(int i = 0; i < elms.getLength(); i++) {
                Element elm = (Element)elms.item(i);
                String child = elm.getAttribute("name");
                for(;;) {
                    elm = (Element)elm.getParentNode();
                    if(elm == null) {
                        break;
                    }
                    if(elm.getNodeName().equals("xsd:schema")) {
                        break;
                    }
                    if(elm.getNodeName().equals("xsd:element") || elm.getNodeName().equals("xsd:complexType")) {
                        String parent = elm.getAttribute("name");
                        md.addParentChild(parent, child);
                        break;
                    }
                 
                }
            }
            elms = doc.getElementsByTagName("xsd:complexType");
            for(int i = 0; i < elms.getLength(); i++) {
                Element elm = (Element)elms.item(i);
                String child = elm.getAttribute("name");
                for(;;) {
                    elm = (Element)elm.getParentNode();
                    if(elm == null) {
                        break;
                    }
                    if(elm.getNodeName().equals("xsd:schema")) {
                        break;
                    }
                    if(elm.getNodeName().equals("xsd:element") || elm.getNodeName().equals("xsd:complexType")) {
                        String parent = elm.getAttribute("name");
                        md.addParentChild(parent, child);
                        break;
                    }
                 
                }
            }
            NodeList attrs = doc.getElementsByTagName("xsd:attribute");
            for(int i = 0; i < attrs.getLength(); i++) {
                Element attr = (Element)attrs.item(i);
                String name = attr.getAttribute("name");
                for(;;) {
                    attr = (Element)attr.getParentNode();
                    if(attr.getNodeName().equals("xsd:element") || attr.getNodeName().equals("xsd:complexType")) {
                        String elm = attr.getAttribute("name");
                        md.addElementAttribute(elm, name);
                        break;
                    }
                 
                }
            }
            System.out.println(md);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

class MyDocument {
    private Map m;
    public MyDocument() {
        m = new HashMap();
    }
    public void addParentChild(String parent, String child) {
        MyElement p = (MyElement)m.get(parent);
        if(p == null) {
            p = new MyElement(parent);
            m.put(parent, p);
        }
        p.addChild(child);
        MyElement c = (MyElement)m.get(child);
        if(c == null) {
            c = new MyElement(child);
            m.put(child, c);
        }
    }
    public void addElementAttribute(String elm, String attr) {
        MyElement e = (MyElement)m.get(elm);
        if(e == null) {
            e = new MyElement(elm);
            m.put(elm, e);
        }
        e.addAttrs(attr);
    }
    public String toString() {
        StringBuffer sb = new StringBuffer();
        Iterator it = m.values().iterator();
        while(it.hasNext()) {
            sb.append(it.next());
        }
        return sb.toString();
    }
}

class MyElement {
    private String name;
    private List childs;
    private List attrs;
    public MyElement(String name) {
        this.name = name;
        childs = new ArrayList();
        attrs = new ArrayList();
    }
    public void addChild(String name) {
        childs.add(name);
    }
    public void addAttrs(String name) {
        attrs.add(name);
    }
    public String toString() {
        StringBuffer sb = new StringBuffer();
        if(childs.size() > 0) {
            sb.append("<!ELEMENT " + name + " (");
            for(int i = 0; i < childs.size(); i++) {
                if(i > 0) sb.append("|");
                sb.append(childs.get(i));
            }
            sb.append(")*>\r\n");
        } else {
            sb.append("<!ELEMENT " + name + " (#PCDATA)>\r\n");
        }
        for(int i = 0; i < attrs.size(); i++) {
            sb.append("<!ATTLIST " + name + " " + attrs.get(i) + " CDATA #IMPLIED>\r\n");
        }
        return sb.toString();
    }
}
Avatar billede arne_v Ekspert
17. januar 2006 - 00:37 #21
men det er stadig ikke korrekt
Avatar billede mik789 Nybegynder
31. oktober 2010 - 16:28 #22
arne_v, læg et svar, så jeg kan lukke sp (forældet)
Avatar billede mik789 Nybegynder
31. oktober 2010 - 16:28 #23
ups, skulle ikke have været mit eget svar, men bare en komm.
arne_v, læg du et svar.
Avatar billede arne_v Ekspert
31. oktober 2010 - 16:45 #24
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester