当前位置 : 主页 > 网页制作 > xml >

.net – 使用xsd.exe工具从具有多个名称空间的XML文件生成XSD文件

来源:互联网 收集:自由互联 发布时间:2021-06-13
我想做的事: 我正在尝试为现有的XML文件生成XSD文件. 我正在使用xsd.exe工具(随Visual Studio一起提供). XML文件中的某些元素是名称空间限定的.在某些情况下,本地名称是相同的,如下所示:
我想做的事:

我正在尝试为现有的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.

网友评论