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
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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