呵呵,俺把刚才的贴子再跟一遍,今天跟你耗上了:)至少有几句话俺看不懂,schema再配合xsl来形成标注?你怎样一个配合法?我有一些不可思议。 或许你的意思是说你的编辑器可以根据schema来提示用户可以输入哪些标签,不可以输入哪些标签,以使用户可以通过你的编辑器轻松地写出一个符合该schema的有效的xml.这样的话我觉得最大的难点在于你不仅仅要解析schema文件,你的程序更主要更复杂的部分在于"理解"这个schema,嘿嘿,不好办,非常不好办。牵涉的逻辑比较繁杂。
调试欢乐多
针对你的这个应用,纯粹就解析XML而言,JDOM足够了。
譬如说出现一个标签<xs:element name="userName" type="xs:string"/>,你在敲完name="userName"的时候,后面应该出现什么内容,你的编辑器怎样出现提示,这就牵涉到你的程序“理解”schema了。
xerces能起到这个作用么??
schema本身也是一个xml文档。那么理论上便存在一个约束schema文件的schema.
呵呵,有点晕?
你到网上去查一下,找到这个文件(好长时间没用xml了,忘在哪了),然后用这个文件去验证你的schema是否有效即可。
俺在那篇“关于java和XML编程问题,若干。enter....”的贴子里已经贴过怎样用xerces进行schema的验证的代码了,你可以看看。
你的意思是说,我用JDOM来操纵XML文档,碰到schema时再调用xerces解析是吧?????这个写程序的时候如何控制呢?最好能给出一个完整的小程序,可以吗?谢谢了
请原谅俺说的难听一点,你可能只是个学生,或者是个刚入IT不久的程序员。俺详细地给你说一遍:你应该把JDOM是个什么东西先搞清楚。JDOM不过是个更好的操纵xml文件的JavaAPI,它本身没有任何的解析验证功能,它是采用一种Adapter的设计模式,将别人的xml parser拿过来用,然后通过这个parser构造成一种我们java程序员更易理解更易使用的数据结构。你在创建你的SAXBuilder时,将验证功能打开不就可以了吗?
本质上不就是怎样在SAX解析器里打开验证schema的功能吗?
摩郎作为斑竹去转告CSDN一下吧
我会去找那个约束schema的schema.这样你在给我拓展一下知识。
会有对DTD约束的DTD吗?
那,你想这样一个问题:DTD是用来约束XML文档的,而DTD本身是XML文档吗?
不是。
因此,没有对DTD约束的DTD。
俺没有给出代码的原因:
1.在公司里面往外贴代码往往会给人造成“嫌疑”。
2.写一段代码还要验证查文档,麻烦的很。关于你在JDOM中构造一个Document对象,怎样进行schema的验证,俺粗粗的看了一下,俺认为应该这样(时间很短,会有不周全的地方,见谅):
1.你只能通过org.xml.sax.XMLReader显示的指定schema验证。
2.构造SAXBuilder时,JDOM中的SAXBuilder没有一个public的方法得到XMLReader。
因此,你可能需要重新写一个类似于SAXBuilder的东西,可以得到XMLReader,然后通过setFeature方法,再将验证的开关打开。这样比较麻烦,可能会有更好的方式?或许JDOM的后续版本会提供此功能?
呵呵,至少俺觉得JDOM中的SAXBuilder封装的太笨拙,没办法利用解析器的特性。事先声明,俺只是随便看了看,可能有考虑不周全的地方,俺得干活了:)
为什么xml和soap放在.net讨论区……
俺总结如下:
SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser");
builder.setValidation(true); Document doc = builder.build("file:///d:\\work\\data.xml");
org.jdom.output.XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
通过如上代码,解析器可自动进行schema的验证。
但要注意以下几个问题:
1: xerces版本:1.4.4. jdom版本:1.0.Beta7
2: 类路径中设置jdom.jar时不要直接用$JDOM_HOME$\build\jdom.jar,因为其内部的META-INF\MANIFEST.MF文件里指定了一个Xerces.jar,其版本为1.2,这样在解析时会报错。俺纳闷了,俺哪来这么多功夫为了一个schema的验证问题纠缠如此之久!
唉,郁闷!
------------------------------------------------------------------
// 程序如下
import org.apache.xerces.parsers.SAXParser;import org.jdom.Document;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
public class XMLTest
{
public static void main(String[] args)
{
try
{
XMLTest t=new XMLTest();
t.go();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void go() throws Exception
{
SAXBuilder saxBuilder=new SAXBuilder("org.apache.xerces.parsers.SAXParser");
saxBuilder.setValidation(true); Document jdomDoc=saxBuilder.build("file:///D:\\WorkRoom\\test.xml");
XMLOutputter xmlOutputter=new XMLOutputter();
xmlOutputter.output(jdomDoc,System.out);
}
}//运行时异常
org.jdom.JDOMException: Error in building: Document root element "Questions", mu
st match DOCTYPE root "null".
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:306)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:682)
at XMLTest.go(XMLTest.java:28)
at XMLTest.main(XMLTest.java:15)
Caused by: org.xml.sax.SAXException: Document root element "Questions", must mat
ch DOCTYPE root "null".
at org.apache.xerces.parsers.AbstractSAXParser.parse(AbstractSAXParser.j
ava:979)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:287)
... 3 more
Root cause: org.xml.sax.SAXException: Document root element "Questions", must ma
tch DOCTYPE root "null".
at org.apache.xerces.parsers.AbstractSAXParser.parse(AbstractSAXParser.j
ava:979)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:287)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:682)
at XMLTest.go(XMLTest.java:28)
at XMLTest.main(XMLTest.java:15)
Root cause: org.xml.sax.SAXException: Document root element "Questions", must ma
tch DOCTYPE root "null".
at org.apache.xerces.parsers.AbstractSAXParser.parse(AbstractSAXParser.j
ava:979)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:287)
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:682)
at XMLTest.go(XMLTest.java:28)
at XMLTest.main(XMLTest.java:15)
俺几次三番地想自己动手试一试,可俺真的没时间去做。
俺尽可能照俺的感觉走:
你看看你的命名空间是否会出问题。
因为jdom里面有时候不指定命名空间会返回null异常。
为什么用SAXBuilder而不用DOMBuilder呢?
另外setFeature和setProperty起什么作用?
xerces分析器分析Schema时也是根据约束Schema的Schema来进行分析吧?
最后为什么不用进一步指定是分析XML还是DTD或Schema呢,Parser会根据头部自己识别还是根据后缀?