如何在XML实例文档中省略命名空间前缀适配现有无前缀XML文件?
问题
现有如下XML Schema(XSD):
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:r="urn:rt" targetNamespace="urn:rt"> <element name="RTC"> <complexType> <sequence> <element name="Nodes"/> <element name="Edges"/> ... </sequence> </complexType> </element> ... </schema>
以及对应的XML实例文档(原版本):
<?xml version="1.0" encoding="UTF-8"?> <catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:rt rt.xsd" xmlns:r="urn:rt"> <r:RTC> <Nodes/> <Edges/> ... </r:RTC> ... </catalog>
现在需要为**顶层元素不带r:前缀(即顶层元素为<RTC>...</RTC>)**的已有XML文件生成对应的XML Schema,请问能否在XML实例文档中省略r:前缀?
回答
当然可以省略r:前缀,但需要调整XML实例的命名空间声明,把urn:rt设为默认命名空间,这样无前缀的元素会自动归属到这个目标命名空间,和XSD中的定义匹配。
具体操作如下:
- 去掉原来的
xmlns:r="urn:rt"声明,替换成xmlns="urn:rt"(默认命名空间) - 如果XML的顶层元素就是
<RTC>,修改后的实例如下:
<?xml version="1.0" encoding="UTF-8"?> <RTC xmlns="urn:rt" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:rt rt.xsd"> <Nodes/> <Edges/> ... </RTC>
- 如果XML里还有其他不属于
urn:rt命名空间的元素(比如原实例中的<catalog>),则需要给这些元素单独声明对应的命名空间,避免和默认命名空间冲突。
另外,你的原始XSD不需要做任何修改——因为RTC元素已经定义在urn:rt目标命名空间下,只要实例中的无前缀元素通过默认命名空间关联到这个命名空间,就能通过Schema校验。
内容的提问来源于stack exchange,提问作者SebastianWilke
相关产品推荐
相关产品推荐

