我有一组用于不同数据类型的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帖子都谈到了验证,这不是我想做的。
答案 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更有意义。