我有一个我无法改变的现有命名空间.我需要将元素添加到复杂类型,以便生成的
XML如下所示:
原始XML:
<?xml version="1.0"?> <Book xmlns="http://bookshop.com"> <Author>Frank Herbert</Author> <Title>Dune</Title> </Book>
新XML:
<?xml version="1.0"?> <Book xmlns="http://bookshop.com" xlmns:custom="http://custombookshop.com> <Author>Frank Herbert</Author> <Title>Dune</Title> <custom:Publisher>Ace</custom:Publisher> </Book>
我要求自定义元素必须如上所示显示名称空间前缀,并且复杂类型名称不得更改.
这是原始的XSD和我尝试使用重新定义的新XSD.这会有效,还是有更好的方法来实现这一目标?提前感谢您的建议.
原XSD:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://bookshop.com" targetNamespace="bookshop.com"> <xs:complexType name="Book"> <xs:complexContent> <xs:sequence> <xs:element name="Author" type="String32" minOccurs="1" maxOccurs="1" /> <xs:element name="Title" type="String32" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:complexContent> </xs:complexType> </xs:schema>
我尝试过新的XSD:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://custombookshop.com" targetNamespace="custombookshop.com"> <xs:redefine schemaLocation="http://bookshop.com"> <xs:complexType name="Book"> <xs:complexContent> <xs:extension base="Book"> <xs:sequence> <xs:element name="Publisher" type="String32" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:redefine> </xs:schema>
您的原始模式应该在complexType中声明序列:
原文链接:https://www.f2er.com/xml/452477.html<xs:complexType name="Book"> <xs:sequence> <xs:element name="Author" type="String32" minOccurs="1" maxOccurs="1" /> <xs:element name="Title" type="String32" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:complexType>
它还应声明targetNamespace等于默认的xmlns命名空间,并包含属性elementFormDefault =“qualified”,以便您可以在实例中使用非限定元素.下面的模式(我添加了一个元素声明和一个simpleType声明)验证了您的原始XML:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://bookshop.com" targetNamespace="http://bookshop.com" elementFormDefault="qualified"> <xs:complexType name="Book"> <xs:sequence> <xs:element name="Author" type="String32" minOccurs="1" maxOccurs="1" /> <xs:element name="Title" type="String32" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:complexType> <xs:element name="Book" type="Book"/> <xs:simpleType name="String32"> <xs:restriction base="xs:string"></xs:restriction> </xs:simpleType> </xs:schema>
假设上面的模式作为原始模式,您可以在具有与原始模式相同的目标名称空间的新模式中重新定义Book复杂类型.如果需要包含来自另一个名称空间的Publisher元素,则必须在第三个模式中声明它.在具有与原始模式相同的目标名称空间的模式中,您可以像这样重新定义Book类型(假设您的原始模式位于bookshop.xsd中:
<xs:redefine schemaLocation="bookshop.xsd"> <xs:complexType name="Book"> <xs:complexContent> <xs:extension base="Book"> <xs:sequence> <xs:element ref="cs:Publisher" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:redefine>
为此,您必须导入声明Publisher元素的模式.假设它在此模式中使用http://custombookshop.com命名空间声明:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://custombookshop.com" xmlns:bs="http://bookshop.com" targetNamespace="http://custombookshop.com"> <xs:import namespace="http://bookshop.com" schemaLocation="bookshop.xsd"/> <xs:element name="Publisher" type="bs:String32" /> </xs:schema>
然后,您可以将其导入重新定义的架构:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://bookshop.com" targetNamespace="http://bookshop.com" xmlns:cs="http://custombookshop.com"> <xs:import schemaLocation="custombookshop.xsd" namespace="http://custombookshop.com"/> <xs:redefine schemaLocation="bookshop.xsd"> ... </xs:redefine> </xs:schema>
现在,您可以使用重新定义的模式验证第二个XML文件.