用于查询XSD文件的Java方法

时间:2011-10-29 18:48:26

标签: java xml xsd

我有一组用于不同数据类型的xsd文件。在Java世界中,生成类型属性列表的最佳方法是什么?

e.g。这两个文件。

file:customer.xsd

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="number" type="xs:integer"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

file:order.xsd

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderid" type="xs:integer"/>
      <xs:element name="customer" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

我想做两件事

1。 一个Java应用程序,它读入XSD并进行处理(不知何故?)。因此,当您运行该程序时,它可以打印出属性

> java -jar printtypes.jar -f customer.xsd
> number : Integer
> name : String
> address : String

2。 某种生成新文件的转换

file:customer.properties

<propertylist>
<prop>
 <name> orderid </name>
 <type> integer </type>
</prop>
<prop>
 <name> customer </name>
 <type> string</type>
</prop>
</propertylist>

我尝试使用java反射来实现上面(1)中的程序,以查询由JAXB生成的Java类。 这创建了一个类的实例并询问了值和字段,但是在值由空序列组成的情况下它不起作用。由于类型擦除,无法返回到原始类型的值。你最终会得到一个空的ArrayList,但你不知道是什么。

我来自C ++的工作,所以我现在对所有这些Java技术都感到有些迷茫。我的Google权力让我失望 - 我见过的大多数JAVA / XSD帖子都谈到了验证,这不是我想做的。

3 个答案:

答案 0 :(得分:2)

问题1。可以使用XPath解决。例如,这个表达式:

/xs:schema/xs:element/xs:complexType/xs:sequence/xs:element/@name

将返回所有名称:

  • number
  • name
  • address

另请参阅:Document - How to get a tag's value by its name?

对于问题2。 XSLT非常适合。这是一个快速而又肮脏的转变:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/xs:schema/xs:element/xs:complexType/xs:sequence">
<propertylist>
    <xsl:for-each select="xs:element">
    <prop>
        <name><xsl:value-of select="@name"/></name>
        <type><xsl:value-of select="@type"/></type>
    </prop>
    </xsl:for-each>
</propertylist>
</xsl:template>
</xsl:stylesheet>

当应用于customer.xsd时,它会产生:

<propertylist xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <prop>
        <name>number</name>
        <type>xs:integer</type>
    </prop>
    <prop>
        <name>name</name>
        <type>xs:string</type>
    </prop>
    <prop>
        <name>address</name>
        <type>xs:string</type>
    </prop>
</propertylist>

有趣的是,你的两个问题都不需要Java。

答案 1 :(得分:2)

您可能希望了解XSOM,它是一个项目,它将提取您的XML架构并生成可以遍历并产生所需结果的对象。

http://xsom.java.net/userguide.html

手工解析模式可能非常棘手,因为可以有不同的方式来表达基本相同的东西。

答案 2 :(得分:1)

上面提到的XSOM是一种方法。

另一种方法是撒克逊的SCM。 Saxon模式处理器将读取一组模式文档,并在称为SCM的XML表示中输出相应的模式组件模型。这比原始的XSD文档更适合处理。如果你想在Java中进行后续处理,XSOM可能更有意义,如果你想在XSLT或XQuery中进行,那么Saxon SCM更有意义。