Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据Java中的模式定义获取xml节点类型?_Java_Xml_Schema - Fatal编程技术网

如何根据Java中的模式定义获取xml节点类型?

如何根据Java中的模式定义获取xml节点类型?,java,xml,schema,Java,Xml,Schema,假设我有一个doc.xml和相应的doc.xsd。我使用xpath检索一些节点,因此我得到了org.w3c.dom.Node的列表。如何从模式中获取每个节点的类型,例如xs:integer、xs:string等 一些解决方案是使用xpath查询“//NodeName[@type]”解析模式,使用node.getNodeName()作为NodeName,但这并不完美。我不能确定模式是否优雅——如果模式中的许多地方都存在NodeName,并且没有作为单独的类型提取,该怎么办 因此,一般来说,我正在寻

假设我有一个doc.xml和相应的doc.xsd。我使用xpath检索一些节点,因此我得到了org.w3c.dom.Node的列表。如何从模式中获取每个节点的类型,例如xs:integer、xs:string等

一些解决方案是使用xpath查询“//NodeName[@type]”解析模式,使用node.getNodeName()作为NodeName,但这并不完美。我不能确定模式是否优雅——如果模式中的许多地方都存在NodeName,并且没有作为单独的类型提取,该怎么办


因此,一般来说,我正在寻找一种可靠的解决方案来获取任何有效xml&xsd的节点类型。

不幸的是,xml模式(xsd)或文档类型定义(DTD)中定义的类型并没有直接绑定到它们验证的xml文档。XML文档中的元素和属性本身并不具有类型,它们只是文本。可以将XSD看作是验证XML文档的脚本,而不是元素和属性的一组类型注释

XML规范并不像您在这里所想的那样定义类型。即使是可以嵌入XML文档中的文档类型定义(DTD),也更多地是关于文档的结构,而不是元素和属性中包含的数据类型

XML模式中描述的类型系统是可应用于XML文档的可选验证层。由于此验证是可选的,标准XMLAPI不提供将XSD中的验证规则绑定到实际属性和元素的方法


我认为XMLAPI可以提供将XSD绑定到特定XML文档的机制,但我不知道有哪种XML解析器可以做到这一点。这并不容易的一个原因是,XML模式中定义的类型系统比大多数主流编程语言支持的类型系统丰富得多。在您的示例中,您可能只对xs:integer、xs:string等感兴趣,但在XML模式中,您可以创建指定范围、模式和其他在大多数编程语言中数据类型不可能实现的类型。要用Java或任何编程语言来表示这种复杂类型的系统,必须通过相当复杂的API来完成。问题是它真的值得吗?我可能会说不。

你应该考虑使用JAXB。它将根据模式类型为您创建Java类。然后将XML文档读入这些类中,这些类是根据您定义XSD的方式键入的。因此xsd:int映射到java int(或者整数包装类,我想不起来),等等。

将DOM元素强制转换为:从那里,您可以访问您要查找的类型信息。

根据David Ds的回答,稍微干净一点,调用getSchemaTypeInfo()在元素或属性上

我所寻找的整个想法是作为类生成的替代方案。问题是模式经常更改,我无法保证生成的代码保持最新。我想我希望利用标准模式验证,并在我自己的院子里使用它的一部分。毕竟,我不需要为java类型映射xsd类型,我所需要的只是关于模式中相应元素的“type”属性的信息。