我想做什么:
我正在尝试为现有的XML文件生成XSD文件。
我正在使用xsd.exe
工具(Visual Studio附带)。
XML文件中的某些元素是名称空间限定的。在某些情况下,本地名称是相同的,如下所示:
<images>
<icons>
<icon url="http://www.icons.com/logo.png"/>
</icons>
<foo:icons>
<foo:foo_icon url="http://www.foo.org/pic.ico"/>
</foo:icons>
</images>
我得到了什么:
致电xsd.exe myfile.xml
会给我一个错误:Cannot add a column named 'icons': a nested table with the same name already belongs to this DataTable.
好的,但这就是命名空间的用途,不是吗?解决这种模棱两可的问题。如果没有名称空间,我只需调用元素foo_icons
而不是用前缀来玩。
我尝试了什么:
我尝试了一种配置xsd.exe
的方法,以便考虑名称空间,但xsd /?
和我的Google查询都没有显示任何答案。 /n[amespace]:
参数不允许指定多个名称空间。
我读过Working with Namespaces in XML Schema,但我感觉不太明白。
我是否必须创建单独的XSD文件并将它们嵌入到彼此中?它也不涉及为此目的使用xsd.exe
。
我真的不太熟悉XSD,所以我可能误解了整个过程的一些基本概念。如果有人能指出我正确的方向,我会很感激。
编辑1 - 遵循Marc Gravell的建议:
我试过了,但我还必须重命名一个(带前缀的)元素,它出现在XML的不同部分(在不同的父节点下),因为xsd
不允许这样做。我不得不将其重命名为elementOne
,elementTwo
等。我打算手动将其重命名。但是我得到的XSD无论如何都不起作用。
标题是:
<xs:schema id="NewDataSet" targetNamespace="http://www.foo.com/bar" xmlns:mstns="http://www.foo.com/bar" xmlns="http://www.foo.com/bar" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified"
xmlns:app1="http://www.foo.com/bar/extensions"
xmlns:app2="http://www.w3.org/XML/1998/namespace">
当我尝试用它验证文件时,我收到一个错误:
Prefix 'app2' cannot be mapped to namespace name reserved for "xml" or "xmlns".
那么,xsd.exe
生成它的目的是什么?该如何修复?
答案 0 :(得分:3)
您使用xsd.exe为您提供XML Schema的方式......它实际上试图提出一个DataSet;而.NET上的确非常有限。
我会在.NET上使用另一个选项:使用记录在here的.NET API构建脚本。
至少对于你的XML片段,它会起作用;我试过了,它创建了一个有效的XmlSchemaSet。下面是我使用我正在使用的工具运行的测试,它依赖于相同的API(有一些额外的铃声和口哨,否则你将不得不手工做一些小修补)。
修复了XML(为foo前缀添加了缺少的命名空间声明):
<images>
<icons>
<icon url="http://www.icons.com/logo.png"/>
</icons>
<foo:icons xmlns:foo="urn:tempuri-org:test">
<foo:foo_icon url="http://www.foo.org/pic.ico"/>
</foo:icons>
</images>
顶级架构(没有目标命名空间,与您的images元素匹配):
<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema xmlns:foo="urn:tempuri-org:test" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import schemaLocation="XSDMultipleNamespaces1.xsd" namespace="urn:tempuri-org:test" />
<xsd:element name="images">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="icons">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="icon">
<xsd:complexType>
<xsd:attribute name="url" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element ref="foo:icons" />
</xsd:sequence>
</xsd:complexType>
foo名称空间的架构:
<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema xmlns="urn:tempuri-org:test" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:tempuri-org:test" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="icons">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="foo_icon">
<xsd:complexType>
<xsd:attribute name="url" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
生成的XML Schema文件可以验证您的XML。