在XML文件中包含XSD架构定义是否有效?

时间:2014-04-07 12:43:03

标签: xml xsd

当我使用Visual Studio(xml资源文件)生成.resx文件时,XSD架构包含在同一文件中。 (参见示例)其他工具能够解释此文件,它似乎是“有效的”。尽管如此,我找不到w3schools的任何有效信息。 Theory教会编写xsd文件并在xml文件中引用它。除了验证通常还提供了xsd文件和xml文件。

在xml文件中定义xsd架构是否有效,如给定示例中所示?如果是,它适用于何处?它包含在节点中?如果您可以提供更多解释的链接,那将非常感激。

<?xml version="1.0" encoding="utf-8"?>
<root>
    <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:element name="root" msdata:IsDataSet="true">
            <xsd:complexType>
                <xsd:choice maxOccurs="unbounded">
                    <xsd:element name="data">
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                            </xsd:sequence>
                            <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
                            <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                            <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="resheader">
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                            </xsd:sequence>
                            <xsd:attribute name="name" type="xsd:string" use="required" />
                        </xsd:complexType>
                    </xsd:element>
                </xsd:choice>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
    </resheader>
    <resheader name="version">
        <value>1.3</value>
    </resheader>
    <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    </resheader>
    <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    </resheader>
  <data name="Key">
    <value>Value</value>
  </data>
</root>

编辑以回应adrianos评论: 我本应该回顾一下W3C网站。阅读和理解起来要困难得多......我现在做了,但是在那么短的时间内我无法全面了解。我发现了什么:

我还没有看到任何提示,包括模式应被视为有效。这对我来说似乎很实用,但它就像混合数据和定义一样。

1 个答案:

答案 0 :(得分:1)

鉴于您的所有参考资料,我几乎可以肯定您知道格式良好的XML与有效XML之间的区别。那么,当你问“它有效吗?”时,你有什么想法?根据什么有效?

您的示例可能有效,但根据某些Microsoft规范 - 其他工具最有可能在此处绘制空白。

如果你正在考虑更多关于任意XML的问题,你有一个XSD,如果你问是否有一种“标准”方式将XSD与XML一起包含,然后神奇地拥有一些-party支持XSD的XML处理器选择XSD并使用它来验证XML的其余部分...然后不,我不认为它有一个标准。

就像你的例子一样,如果你想定义自己的XML格式来内联XSD,那么XML或XSD规范中就没有任何东西可以让你这样做;没有其他工具可以提取它,但它可以适用于您的专有应用程序。我想指出,由于与互操作性,版本控制等相关的原因,有一些数据格式包括模式和数据。

提供关于用于验证的XSD的“提示”的标准化方法确实是您引用的XML Schema Instance属性schemaLocation和noNamespaceSchemaLocation;然而,规范还说这些只是“提示”,处理器可以自由地忽略它们 - 所以即使有效,它们也可能不起作用。

Example 1(没有命名空间):

<person xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://adventure-works.com/schemas/person.xsd">
   <name>John</name>
   <height>59</height>
</person>

Example 2(多个名称空间,多个模式):

<p:Person xmlns:p="http://contoso.com/People" xmlns:v="http://contoso.com /Vehicles" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=
     "http://contoso.com/People 
      http://contoso.com/schemas/people.xsd 
      http://contoso.com/schemas/Vehicles
      http://contoso.com/schemas/vehicles.xsd
      http://contoso.com/schemas/People
      http://contoso.com/schemas/people.xsd">
    <name>John</name>
    <age>28</age>
    <height>59</height>
    <v:Vehicle>
        <color>Red</color>
        <wheels>4</wheels>
        <seats>2</seats>
    </v:Vehicle>
</p:Person>

几乎任何XML编辑器都有自己的支持机制,可以将XSD与XML相关联,从单个属性到XSD目录,当然还有对XSI属性的支持。

“内联”XML中的XSD是一项棘手的业务;如果您涉及多个XML实例,那么您有维护问题,等等。如果出于某种原因,我真的需要这样的东西,我会使用XInclude