在Java中使用多个命名空间验证XML

在Java中使用多个命名空间验证XML,java,xml,validation,xml-namespaces,xsd-validation,Java,Xml,Validation,Xml Namespaces,Xsd Validation,我正在尝试验证使用多个名称空间的XML文档。我想在主名称空间的文档中嵌入辅助名称空间的标记。主/主命名空间不“知道”扩展/辅助命名空间 test.xml <?xml version="1.0" encoding="UTF-8"?> <book xmlns ="MyMain_FPI" xmlns:ns2="MyExtension_FPI" > <ns2:playmusic/> <chapter/>

我正在尝试验证使用多个名称空间的XML文档。我想在主名称空间的文档中嵌入辅助名称空间的标记。主/主命名空间不“知道”扩展/辅助命名空间

test.xml

<?xml version="1.0" encoding="UTF-8"?>
<book
    xmlns    ="MyMain_FPI"
    xmlns:ns2="MyExtension_FPI"
    >
    <ns2:playmusic/>
    <chapter/>
    <chapter/>
</book>
如您所见,我直接将XSD文件添加到DocumentBuilderFactory。 这些文件是:

main.xsd

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="MyMain_FPI"
  targetNamespace="MyMain_FPI"
    elementFormDefault="qualified">
  <xs:element name="book">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="chapter"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="chapter">
    <xs:complexType/>    
  </xs:element>
</xs:schema>
<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="MyExtension_FPI"
  targetNamespace="MyExtension_FPI"
    elementFormDefault="qualified">
  <xs:element name="playmusic">
  </xs:element>
</xs:schema>
也就是说,这在主名称空间中是意外的-这是可以理解的,因为元素本身在该名称空间中是未知的。我希望在再次验证主名称空间中的文档时忽略扩展名称空间的元素,反之亦然——这意味着我可以在主名称空间中嵌入扩展名称空间后面的文档。但这显然是行不通的


我遗漏了什么?

您的
main.xsd
书中允许的元素中是明确的。如果希望允许任何附加元素,则需要在
main.xsd
中声明。之后,您可以添加所需的任何扩展XSD。看

新main.xsd

<xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns="MyMain_FPI"
targetNamespace="MyMain_FPI"
  elementFormDefault="qualified">
<xs:element name="book">
  <xs:complexType>
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="unbounded" />
      <xs:element maxOccurs="unbounded" ref="chapter"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="chapter">
  <xs:complexType/>    
</xs:element>
</xs:schema> 


XSD表示“book”元素有一个“chapter”元素列表。你试图加入一个不同的元素。我不确定你的问题是什么。您想知道如何重写
main.xsd
以允许播放音乐吗?我想不必重写
main.xsd
就可以验证文档。两个XSD实际上并不相关。我假设我可以编写一个结合了这两个XSD的XSD,但那会很烦人,因为我的实际应用程序可能有几个扩展XSD,这些扩展XSD可能存在,也可能不存在,列表可能会继续。(将其视为一种插件的嵌入式子文档)。我的问题是是否有任何方法来验证它,这样验证器就不会抱怨extension.xsdThank中的元素了。ANY元素是一个很好的折衷方案,它可以使主XSD保持没有可能扩展的线索,也可以在文档树中显示未知(在
main.XSD
中)元素时仍然有效。这样,我只需要在
main.xsd
中定义可能的扩展点。
[Error] test.xml:6:18: cvc-complex-type.2.4.a: Ungültiger Content wurde beginnend mit Element 'ns2:playmusic' gefunden. '{"MyMain_FPI":chapter}' wird erwartet.
<xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns="MyMain_FPI"
targetNamespace="MyMain_FPI"
  elementFormDefault="qualified">
<xs:element name="book">
  <xs:complexType>
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="unbounded" />
      <xs:element maxOccurs="unbounded" ref="chapter"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="chapter">
  <xs:complexType/>    
</xs:element>
</xs:schema>