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?
Annonceindlæg tema
Cloud & AI
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
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(); } }
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?
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
27. december 2005 - 14:25
#4
men det skal muligvis forbedres lidt - det er kun et første draft
28. december 2005 - 09:33
#5
ok, jeg prøver mig frem
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
28. december 2005 - 11:41
#7
har du compilet uden fejl ?
29. december 2005 - 08:59
#8
hvordan ser jeg det?
30. december 2005 - 23:12
#9
hvad skete der da du skrev: javac Schema2DTD.java ?
31. december 2005 - 09:39
#10
Prompten svarede: 'javac' blev ikke genkendt som en intern eller ekstern kommando, et program eller en batchfil.
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 ?
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
31. december 2005 - 12:04
#13
mystisk står du i samme dir ? ligger der en Schema2DTD.class ?
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
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)
01. januar 2006 - 12:52
#16
men koden skaber faktisk en dtd-fil som jeg beder den om. Den er bare tom.
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 ?
01. januar 2006 - 17:23
#18
11. januar 2006 - 07:03
#19
fandt du ud af noget? ellers lad os slutte her. jeg giver gerne points for dit besvær.
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(); } }
17. januar 2006 - 00:37
#21
men det er stadig ikke korrekt
31. oktober 2010 - 16:28
#22
arne_v, læg et svar, så jeg kan lukke sp (forældet)
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.
31. oktober 2010 - 16:45
#24
kommer her
Kurser inden for grundlæggende programmering