我正在尝试为现有的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会给出错误:无法添加名为“icons”的列:具有相同名称的嵌套表已属于此DataTable.
好的,但这就是命名空间的用途,不是吗?解决这种模棱两可的问题.如果没有名称空间,我只会调用元素foo_icons而不是使用前缀.
我尝试了什么:
我试图寻找一种方法来配置xsd.exe,以便它考虑名称空间,但没有xsd /?我的谷歌查询也没有透露任何答案. / 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">
当我尝试用它验证文件时,我收到一个错误:
前缀’app2’无法映射到为“xml”或“xmlns”保留的命名空间名称.
那么,xsd.exe的目的是什么呢?该如何修复?
你使用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.