【问题标题】:XPath evaluation of "xs:complexType[@name='Any']" results in empty target node“xs:complexType[@name='Any']”的 XPath 评估导致空目标节点
【发布时间】:2014-10-16 17:12:56
【问题描述】:

我正在尝试让 hyperjaxb 处理真实的模式。我下载并解压缩了 hyperjaxb maven 项目from this link,然后使用cmd.exe 导航到根目录,并通过运行mvn clean install 使用示例数据对其进行测试,以确保它与示例模式一起使用。然后,我将schema.xsdpo.xmlbindings.xjb 文件替换为实际图形的精简版本,以便我可以准备通过上面链接的hyperjaxb 项目运行真正的应用程序。然后我再次运行mvn clean install。但是,我收到以下错误消息:

[ERROR] Error while parsing schema(s).Location 
[ file:/C:/path/to/src/main/resources/bindings.xjb{25,53}].
com.sun.istack.SAXParseException2; systemId: 
file:/C:/path/to/src/main/resources/bindings.xjb; lineNumber: 25; columnNumber: 53; 
XPath evaluation of "xs:complexType[@name='Any']" results in empty target node  

从替换的bindings.xjb 文件中可以读取at this link. 使用schema.xsd 文件at this link 和您可以阅读的po.xml at this link

bindings.xjb的相关部分是:

<jaxb:bindings node="xs:complexType[@name='Any']">
    <hj:entity>
        <orm:table name="any"/>
    </hj:entity>
</jaxb:bindings>

schema.xsd 中ANY complexType 的定义为:

<xs:complexType name="ANY"><!-- abstract="true">-->
  <xs:annotation>
    <xs:documentation>
        Some documentation.
    </xs:documentation>
  </xs:annotation>
  <xs:attribute name="nullFlavor" type="NullFlavor" use="optional">
    <xs:annotation>
      <xs:documentation>
           Some other documentation.
        </xs:documentation>
    </xs:annotation>
  </xs:attribute>
</xs:complexType>  

请注意,完整的代码在上面的链接中。 如何解决此错误?

【问题讨论】:

    标签: xml maven jaxb xsd hyperjaxb


    【解决方案1】:

    你应该使用下面的配置..

    <jaxb:bindings node="//xs:complexType[@name='ANY']">
        <hj:entity>
            <orm:table name="any"/>
        </hj:entity>
    </jaxb:bindings>
    

    你能在这个我对另一个主题的回答中找到一个例子。 https://stackoverflow.com/a/24953369/3364187


    我试过你的项目,这个配置很好用。让我知道是否适用于您的环境。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <jaxb:bindings
        version="2.1"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations"
        xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
        jaxb:extensionBindingPrefixes="hj orm">
    
        <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
            <jaxb:globalBindings generateIsSetMethod="true"/>
            <jaxb:schemaBindings>
                <jaxb:package name="org.jvnet.hyperjaxb3.ejb.tests.pocustomized"/>
            </jaxb:schemaBindings>
            <jaxb:bindings node="//xs:complexType[@name='InfrastructureRoot.typeId']">
                <hj:entity>
                    <orm:table name="typeId"/>
                </hj:entity>
            </jaxb:bindings>
            <jaxb:bindings node="//xs:complexType[@name='II']">
                <hj:entity>
                    <orm:table name="II"/>
                </hj:entity>
            </jaxb:bindings>
            <jaxb:bindings node="//xs:complexType[@name='ANY']">
                <hj:entity>
                    <orm:table name="any"/>
                </hj:entity>
            </jaxb:bindings>
        </jaxb:bindings>
    
    
    </jaxb:bindings>
    

    简而言之,每个节点都丢失了//

    从当前节点中选择文档中匹配的节点 选择无论他们在哪里

    复杂类型不是“Any”而是“ANY”,那么正确的节点是@name='ANY'

    【讨论】:

    • 非常感谢您对此进行调查。我刚刚尝试了您的更改,但它会导致完全相同的错误。还有什么可能导致这种情况?
    • 你能补充更多关于 XSD 的细节吗?
    • 我发布了整个 xsd 文件以及所有其他相关文件,以完全重现我上面原始帖子中链接中的问题。 xsd 文件是 259 行,所以我不想污染整个帖子。但是有人可以使用上面的所有链接在几分钟内在本地机器上重现该问题。
    • 我建议你this link 简要解释xpath的语法。取而代之的是here a link 解释如何制作绑定文件。是的,我认为您必须为要自定义的每个实体创建一个绑定。我添加了解决方案的更多细节。
    • @Xstian 当且仅当您需要自定义时才需要绑定,例如更改表名。否则 Hyperjaxb 默认会生成一些合理的名称。所有的自定义都是完全可选的。 confluence.highsource.org/display/HJ3/…
    猜你喜欢
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多