呵呵,俺把刚才的贴子再跟一遍,今天跟你耗上了:)至少有几句话俺看不懂,schema再配合xsl来形成标注?你怎样一个配合法?我有一些不可思议。 或许你的意思是说你的编辑器可以根据schema来提示用户可以输入哪些标签,不可以输入哪些标签,以使用户可以通过你的编辑器轻松地写出一个符合该schema的有效的xml.这样的话我觉得最大的难点在于你不仅仅要解析schema文件,你的程序更主要更复杂的部分在于"理解"这个schema,嘿嘿,不好办,非常不好办。牵涉的逻辑比较繁杂。 

解决方案 »

  1.   

    兄台,抱歉今天来回复。schema也是符合xml语法的对吧,这样配合xsl不能生成Html页面么?不过你说的也对我好象应该根据schema再生成一个xml(其实我最早是这么想的).那么我觉得难点在于理解用户制订的数据结构,数据类型。表现形式的定义等.还好现在我要做的是Schema编辑器,可以是从无到有,也可以对现有schema进行扩充或修改.这样我用JDOM来写schema应该很方便对吗?
      

  2.   

    这样我只写个能编辑schema的编辑器,是不是用JDOM就足够了呢?
      

  3.   

    只写个编辑schema的编辑器的话,关键的难点不在于解析xml。而是你的程序要能“理解”schema,还是牵涉一个比较复杂的数据结构。
    针对你的这个应用,纯粹就解析XML而言,JDOM足够了。
      

  4.   

    关键是我得理解schema吧。simpleType,complexType等等
      

  5.   

    不是你个人理解schema的问题(呵呵,这是最基本的),而是你要建立怎样一个数据结构,让你的程序理解这个schema。
    譬如说出现一个标签<xs:element name="userName" type="xs:string"/>,你在敲完name="userName"的时候,后面应该出现什么内容,你的编辑器怎样出现提示,这就牵涉到你的程序“理解”schema了。
      

  6.   

    对了,如果写好一个schema肯定要效验一下吧,这个时候就调用xerces来效验是么?
    xerces能起到这个作用么??
      

  7.   

    因为schema毕竟和XML有些区别的,譬如minOccurs,simpleType,use这些关键字JDOM解析不到吧?对这个schema总得做个语法效验
      

  8.   

    靠!我发觉俺整个成了你的顾问了:)schema 可以约束 xml文档。
    schema本身也是一个xml文档。那么理论上便存在一个约束schema文件的schema.
    呵呵,有点晕?
    你到网上去查一下,找到这个文件(好长时间没用xml了,忘在哪了),然后用这个文件去验证你的schema是否有效即可。
      

  9.   

    to freekevin:我找了好久了,都没有找到JDOM+Xerces来验证Schema的例子你能发段完整的程序代码来看看吗,我给100分,谢谢了
      

  10.   

    to:Patrick_DK(疾风摩郎)
    俺在那篇“关于java和XML编程问题,若干。enter....”的贴子里已经贴过怎样用xerces进行schema的验证的代码了,你可以看看。
      

  11.   

    看过了,就是SAX来验证嘛
    你的意思是说,我用JDOM来操纵XML文档,碰到schema时再调用xerces解析是吧?????这个写程序的时候如何控制呢?最好能给出一个完整的小程序,可以吗?谢谢了
      

  12.   

    to:Patrick_DK(疾风摩郎)
    请原谅俺说的难听一点,你可能只是个学生,或者是个刚入IT不久的程序员。俺详细地给你说一遍:你应该把JDOM是个什么东西先搞清楚。JDOM不过是个更好的操纵xml文件的JavaAPI,它本身没有任何的解析验证功能,它是采用一种Adapter的设计模式,将别人的xml parser拿过来用,然后通过这个parser构造成一种我们java程序员更易理解更易使用的数据结构。你在创建你的SAXBuilder时,将验证功能打开不就可以了吗?
    本质上不就是怎样在SAX解析器里打开验证schema的功能吗?
      

  13.   

    to freekevin(kevin)呵呵,你老人家说的对啊,小弟我刚学XML不久,有不懂的地方还请不吝赐教:))
      

  14.   

    欢迎‘魔’朗兄,freekevin(kevin)你其只是我个人的顾问你这是在做XML的中国推广,功德无量啊^^.我会去找那个约束schema的schema.这样你在给我拓展一下知识。会有对DTD约束的DTD吗?
      

  15.   

    我发现CSDN的xsl转换可能有问题吧。怎么不自动回行,敲的帖子不能看全
    摩郎作为斑竹去转告CSDN一下吧
    我会去找那个约束schema的schema.这样你在给我拓展一下知识。
    会有对DTD约束的DTD吗?
      

  16.   

    to freekevin:    我看你解释了这么多,老是理论的话。最好再配段源程序,这样大家看起来就清楚多了,理解也快啊,特别是对我这种刚学不久的人来说啊。
      

  17.   

    呵呵,对DTD约束的DTD?
    那,你想这样一个问题:DTD是用来约束XML文档的,而DTD本身是XML文档吗?
    不是。
    因此,没有对DTD约束的DTD。
      

  18.   

    to:Patrick_DK(疾风摩郎)
    俺没有给出代码的原因:
    1.在公司里面往外贴代码往往会给人造成“嫌疑”。
    2.写一段代码还要验证查文档,麻烦的很。关于你在JDOM中构造一个Document对象,怎样进行schema的验证,俺粗粗的看了一下,俺认为应该这样(时间很短,会有不周全的地方,见谅):
    1.你只能通过org.xml.sax.XMLReader显示的指定schema验证。
    2.构造SAXBuilder时,JDOM中的SAXBuilder没有一个public的方法得到XMLReader。
    因此,你可能需要重新写一个类似于SAXBuilder的东西,可以得到XMLReader,然后通过setFeature方法,再将验证的开关打开。这样比较麻烦,可能会有更好的方式?或许JDOM的后续版本会提供此功能?
    呵呵,至少俺觉得JDOM中的SAXBuilder封装的太笨拙,没办法利用解析器的特性。事先声明,俺只是随便看了看,可能有考虑不周全的地方,俺得干活了:)
      

  19.   

    来晚了,祝你周末快乐,呵呵等我OOM完了,再来请教你XML的问题吧:)
      

  20.   

    hehe,热闹呀。
    为什么xml和soap放在.net讨论区……
      

  21.   

    有一个愚笨的问题,我理论上知道Xerecs如何使用schema来验证xml,但是实际上,我的验证,都是不通过……:(
      

  22.   

    关于在JDOM中通过schema验证的问题,俺昨天随口说了几句,总觉得不妥,嘿嘿,非得自己试验一下不可。
    俺总结如下:
                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的验证问题纠缠如此之久!
    唉,郁闷!
      

  23.   

    to freekevin:我按照你所说的,写了一个程序,可是不论那个xml文件是否是validated的,都运行时抛出一堆异常,能给看看吗?
    ------------------------------------------------------------------
    // 程序如下
    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)
      

  24.   

    靠,你把俺问傻了。
    俺几次三番地想自己动手试一试,可俺真的没时间去做。
    俺尽可能照俺的感觉走:
    你看看你的命名空间是否会出问题。
    因为jdom里面有时候不指定命名空间会返回null异常。
      

  25.   

    打断问几个问题
    为什么用SAXBuilder而不用DOMBuilder呢?
    另外setFeature和setProperty起什么作用?
    xerces分析器分析Schema时也是根据约束Schema的Schema来进行分析吧?
    最后为什么不用进一步指定是分析XML还是DTD或Schema呢,Parser会根据头部自己识别还是根据后缀?