有下面一段xsd的代码,我想问问,有什么类,或者什么开发包,能够读这段 xsd 然后 生成一个新的类,这个新的类能够记录
<xsd:element maxOccurs="1" minOccurs="0" name="v1" type="xsd:string"/> 这一行,其中,value 和 name 要跟据读的内容而生成相应类型和值,比如,value 是 int 型的,就要生成 Integerclass par {
String name;
String value;
}<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
   <xsd:element name="T1">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element maxOccurs="1" minOccurs="0" name="v1" type="xsd:string"/>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>

解决方案 »

  1.   

    如果是指生成类的代码,用jaxp就可以了,对类型处理可以定义xsd type到java type的mapping
      

  2.   

    JAXB 就是专门干这事的,如果是 JDK 6 的话 bin 中直接有 xjc 工具:xjc x.xsd -p com<?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
       <xsd:element name="T1">
          <xsd:complexType>
             <xsd:sequence>
                <xsd:element maxOccurs="1" minOccurs="0" name="v1" type="xsd:string"/>
             </xsd:sequence>
          </xsd:complexType>
       </xsd:element>
    </xsd:schema>这个 Schema 文件生成的类是这样的://
    // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
    // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
    // Any modifications to this file will be lost upon recompilation of the source schema. 
    // Generated on: 2011.01.01 at 11:10:25 下午 CST 
    //
    package com;import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    /**
     * <p>Java class for anonymous complex type.
     * 
     * <p>The following schema fragment specifies the expected content contained within this class.
     * 
     * <pre>
     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="v1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * </pre>
     * 
     * 
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "v1"
    })
    @XmlRootElement(name = "T1")
    public class T1 {    protected String v1;    /**
         * Gets the value of the v1 property.
         * 
         * @return
         *     possible object is
         *     {@link String }
         *     
         */
        public String getV1() {
            return v1;
        }    /**
         * Sets the value of the v1 property.
         * 
         * @param value
         *     allowed object is
         *     {@link String }
         *     
         */
        public void setV1(String value) {
            this.v1 = value;
        }
    }
    绝对不会生成这种名字不知道从什么地方来的东西!class par {
    String name;
    String value;
    }
      

  3.   


    按楼上的说法,JAXB 会生成一个 *.java 文件。 如果在实际的使用中,如果我们事先不知道 schema 是个什么样子,但是需要动态的生成相应的类,是不是要经历,生成java文件,将这个java文件编译,生成class文件的这样的一个过程呢?现在有两个问题:1 有比这个过程更简单一点的方法么?2 如果需要按照这个过成,那么是不是就要 runtime 对 java 进行编译,然后,找到 class, 加载它,调用其中的一些方法(方法有可能在这个 class,或者别的 已经有的类中)。我是先这么做过,但是对于程序何时编译完成生成 class 不是很有把握,总是写一个循环,不断的检测某个特定的文件夹,感觉方法有点笨,有新的方法么?谢谢
      

  4.   

    你在做 Web 服务客户端?
      

  5.   

    有很多工具可以反向产生XML Schema
    其中一个就是apache开源项目我经常这么干,不过是生成Schema以后要自己手动编辑一把
    以为你的XML文件可以不是标准的,所以要就有点XML/XSL的语法基础火龙果的思路绝对正确!其他人回帖的思路值得商榷
      

  6.   

    Web 服务客户端的话,连 WSDL 内容是什么都不知道,还有必要继续做下去么?
      

  7.   

    我的疑问是为什么非要先转换成一个对应类型的Java 对象?不能直接用类似 DOM 一个 XPATH 路径去取得或更改你想要的值吗?直接以 XML 方式去操作它就不需要中间的转换过程。Apache JXPath 可以把 XML 和 Java POJO 同等对待地以 XPath 方式去处理。可以用类似 /@name 的表达式去得到当前这个 par 对象的值,你的当前对象可以是一个 XML 文档对作 Context 也可以是内存中的 par 对象实例。
      

  8.   


    因为在运行的时候,事先不知道XML里面的内容是什么样子,只用从服务器上面下载下来一个shceme(*.xsd)字符串片段,然后分析这个字符串片段。也就是说,客户端事先不太可能知道是什么样子。用动态的加载,比如一个页面,事先不知道,只有知道了scheme才能做出这个页面的