首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个文件中的多个Xsd模式

一个文件中的多个Xsd模式
EN

Stack Overflow用户
提问于 2015-03-25 15:05:31
回答 2查看 21.5K关注 0票数 4

我有多个Xsd模式文件(小的),并想以某种方式将它们合并到一个大文件中,我想在C#代码中选择相应的部分并对其进行验证,每个Xsd模式内容都有一个节点。问题是,我可以看到一个警告“全局元素'xxx‘已经声明了。”当使用Visual打开Xml文件时(我肯定不是Xsd专家;我确实重复了相同的元素)。

对这种方法的正确性有什么看法吗?我是否应该使用CData作为Xsd内容的替代?

Xml文件示例:

Xml 1:

代码语言:javascript
运行
复制
<resource xmlns="">
  <identifier>5401902302111</identifier>
  <product>printer</product>
  <requestedby />
</resource>

Xml 2:

代码语言:javascript
运行
复制
<resource xmlns="">
  <identifier>5401902302112</identifier>
  <email>someone@em.com</email>
</resource>

Xsd 1:

代码语言:javascript
运行
复制
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:element name="resource">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:long" name="identifier"/>
                  <xs:element type="xs:string" name="requestedby"/>
                  <xs:element type="xs:string" name="product"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:schema>

Xsd 2:

代码语言:javascript
运行
复制
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:element name="resource">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:long" name="identifier"/>
                  <xs:element type="xs:string" name="email"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:schema>

我最后想要的是:

代码语言:javascript
运行
复制
*<?xml version="1.0" encoding="utf-8"?>
<resource>
  <resourcedata type="acquisition">
    <details>
      <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="resource">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:long" name="identifier"/>
              <xs:element type="xs:string" name="requestedby"/>
              <xs:element type="xs:string" name="product"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:schema>
    </details>
  </resourcedata>
  <resourcedata type="warningletter">
    <details>
      <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="resource">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:long" name="identifier"/>
              <xs:element type="xs:string" name="email"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:schema>
    </details>
  </resourcedata>
</data>*

C#代码:

代码语言:javascript
运行
复制
var xsdContent =
                xDoc.Element("resource").Elements("resourcedata")
                    .Where(
                        x =>                            
                            x.Attribute("type").Value == "acquisition")
                    .FirstOrDefault().Element("details").FirstNode.ToString();            


            var doc = new XDocument(xElementContent);

            XmlSchemaSet schemas = new XmlSchemaSet();
            schemas.Add("", XmlReader.Create(new StringReader(xsdContent)));

            Console.WriteLine("Validating doc");
            bool errors = false;
            doc.Validate(schemas, (o, e) =>
            {
                Console.WriteLine("{0}", e.Message);
                Console.WriteLine("{0}", e.Exception);
                errors = true;
            });

            Console.WriteLine("doc {0}", errors ? "did not validate" : "validated");

(xElementContent变量包含Xml内容)

谢谢

EN

回答 2

Stack Overflow用户

发布于 2015-04-19 01:20:37

与其他人不同的是,我认为您的问题的唯一问题是,它未能说明为什么要像您所描述的那样创建XML文件格式。事实上,我参与了一个有趣的讨论,在这里所以,C. M. Sperberg-McQueen甚至为这个讨论组织了一个演示,最后得出结论:

因此,它说明可以在同一个XML文档中嵌入多个符合规范的模式文档。(由于这似乎是一些感兴趣的方面的问题,显然还应该注意到WSDL在这里没有涉及到。)

我觉得有必要链接C.M.Sperberg-McQueen的答案,因为您说了,我想的是xml文件,而不是XSD文件(这将是kjhughes点)。

我认为您没有给出一个很好的场景,因为下面的单个模式将很好地满足您的XML。

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="resource">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="identifier" type="xs:unsignedLong"/>
                <xs:choice>
                    <xs:element minOccurs="0" name="email" type="xs:string"/>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="product" type="xs:string"/>
                        <xs:element minOccurs="0" name="requestedby" type="xs:string"/>                             
                    </xs:sequence>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

让我们来看看一些场景(如果您有其他问题,请更新您的问题):

  • 根元素可能有不同的名称。在这种情况下,只需创建另一个全局元素,与该名称匹配。
  • 根元素可能位于不同的命名空间中。在这种情况下,只需创建另一个XSD文件,其中的targetNamespace与您的名称空间相匹配。然后将所有的XSD添加到XmlSchemaSet中,然后进行验证。
  • 对于相同的元素,您的内容模型可能不同,但在XSD1.0方面是可以协调的(因为您显示的是股票.NET代码,所以我假设您坚持.NET支持的内容)。我在上面创建的模式就是这样。
  • 您不能使用XSD1.0;它可能使用XSD1.1中的特性(例如协约束、类型替代等)- point is,XSD 1.1在这里不能使用。然后,您将多个XSD放在一个XML文件中的建议会很有魅力。事实上,我认为它是.NET世界中XSD1.1的一个穷人的替代品.

对于后者,我建议采取一种稍微不同的方法。我将使用XInclude将XSD连接到一个文件中--如果这是您的处理模型所需要的;有一个网络库这里。这将允许独立地编写XSD,从而确保每个XSD都是有效的,并使用通用编辑器(包括Visual )。

票数 4
EN

Stack Overflow用户

发布于 2015-03-25 16:46:41

与其发明自己的、临时的组合XSD的方法,不如使用基于xsd:包括xsd:导入的标准方法。

另见:xsd:include和xsd:import之间有什么区别?

而且,除非您有非常具体的理由使用代码中的特殊方法分派验证,否则应该在文档级别进行验证,并让解析器为您定位适当的声明。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29259349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档