java - 无法验证具有命名空间的 XML 的 XSD
问题描述
我无法使用以下 XSD 验证 XML,
<myTest>
<standardHeader xmlns="http://tow.gow.ho.com/2009/08/StandardHeader/">
<data>
<LEVELDATA>D2D</LEVELDATA>
</data>
</standardHeader>
</myTest>
XSD 数据
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="myTest">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="standardHeader" minOccurs="0">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="data" minOccurs="0">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="LEVELDATA" minOccurs="0" type="xsd:normalizedString"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
使用 XML 验证此 XSD 时出现以下错误,
cvc-complex-type.2.4.a:发现以元素“standardHeader”开头的无效内容。需要“{standardHeader}”之一。
我怎样才能提供这个standardHeader
标签:
targetNamespace="http://tow.gow.ho.com/2009/08/StandardHeader/"
解决方案
此问题的一种可能解决方案是将 XSD 拆分为两个文件:
一个用于第一个不存在的命名空间 ( a.xsd
),另一个用于第二个命名空间 ( b.xsd
),由targetNamespace=...
in b.xsd
while声明,a.xsd
不需要该声明。具有自己命名空间的第二个文件与<xsd:import namespace="..."
指令一起导入。这个命名空间也必须包含在xsd:schema
元素的命名空间声明中(这里xmlns:std
)。
也是这样a.xsd
:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:std="http://tow.gow.ho.com/2009/08/StandardHeader">
<xsd:import namespace="http://tow.gow.ho.com/2009/08/StandardHeader"
schemaLocation="b.xsd" />
<xsd:element name="myTest">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element ref="std:standardHeader" minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
并且b.xsd
是:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://tow.gow.ho.com/2009/08/StandardHeader">
<xsd:element name="standardHeader">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="data" minOccurs="0">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="LEVELDATA" minOccurs="0" type="xsd:normalizedString"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
这两个 XSD 确实使用其名称空间来验证您的 XML 文件。
这个答案的灵感来自这个网页:“多模式项目:零、一个或多个命名空间?” . 它不会一对一地复制解决方案,而是受到该网页的启发。
推荐阅读
- javascript - 将单词长度存储在javascript数组中
- pdflib - PDFlib - 使用 ArtBox 存储放置元素的宽度和高度
- jquery - 使用 Fabric JS 在画布上键入文本的问题
- apache2 - 针对摘要后端的 Apache 代理身份验证
- javascript - 在 Windows 命令中转义双引号
- javascript - 为什么我的 django 异常处理不起作用
- javascript - 从 JavaScript 数组名称值对动态添加多个系列的 highcharts
- typescript - 将 Sharepoint 在线列表中的数据输出放入 HTML 表中
- firebase - Firestore - 如何建模和查询 2 个集合的关系 - IOT 用例
- javascript - 使用 React 渲染 HTMLAudioElement DOM 元素