我的XSD XML Schema出了什么问题?

时间:2012-04-09 06:20:42

标签: xml xsd root complextype

自从我搞乱模式以来,我已经3年了,我记得他们对名称空间前缀非常特别。我还记得在Eclipse中使用XML编辑器时没有展开的复杂类型不能轻松解析(我有Indigo)。

您是否可以通过XML专家查看我的XML文件并告诉我前面的XSD XML架构有什么问题?

感谢。

+++++

Eclipse抱怨:

根元素后面的文档中的标记必须格式正确。

我应该指出我手工创建了XML并从中自动生成了XML:

http://www.xmlforasp.net/codebank/system_xml_schema/buildschema/buildxmlschema.aspx

(单独复杂类型:正如我3年前手动使用亚马逊的Amazon Seller Central XML文件手动完成的那样)

如果我认为应该在一个案例中使用ref,但我会按照专家的意见。

+++++

<?xml version="1.0" encoding="utf-16"?>

<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="idioms" type="idiomsType" />
    <xsd:complexType name="idiomsType">
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" name="idiom" type="idiomType" />
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="idiomType">
        <xsd:sequence>
            <xsd:element name="phrase" type="xsd:string" />
            <xsd:element name="meaning" type="xsd:string" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

<idioms>
    <idiom>
        <phrase>A bit much</phrase>
        <meaning>Excessive or annoying.</meaning>
    </idiom>
    <idiom>
        <phrase>A bridge too far</phrase>
        <meaning>Act of overreaching.</meaning>
    </idiom>
</idioms>

好的,更新。我将XSD与XML内联的快捷方式是非法的。所以我把它放回XSD文件中。我还了解到我无法使用xml启动前缀,因此我将其更改为'tc'。

XSD现在是正确的(与我展开的亚马逊卖家中心XSD的风格相同)。

<?xml version="1.0" encoding="utf-16"?>

<xsd:schema xmlns:tcidioms="urn:tcidioms" targetNamespace="urn:tcidioms" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:element name="idioms" type="tcidioms:idiomsType"/>
     <xsd:complexType name="idiomsType">
         <xsd:sequence>
             <xsd:element maxOccurs="unbounded" name="idiom" type="tcidioms:idiomType" />
         </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="idiomType">
         <xsd:sequence>
             <xsd:element name="phrase" type="xsd:string" />
             <xsd:element name="meaning" type="xsd:string" />
         </xsd:sequence>
     </xsd:complexType>
</xsd:schema>

但我无法尝试将此文件包含在内,现在看起来像这样(XML和XSD位于同一目录中):

它抱怨:没有检测到文档的语法约束(DTD或XML模式)。

意味着我的XML文档中的2行不正确。我已经尝试了几个变种来包含这个文件,但没有一个有效。保持在我的这个XML(和XSD)将从本地文件系统而不是通过http读取。它还会以这种方式验证吗?

<?xml version="1.0" encoding="utf-16"?>

<idioms xmlns:tcidioms="urn:tcidioms" targetNamespace="urn:tcidioms ./EnglishIdioms.xsd">
    <idiom>
        <phrase>A bit much</phrase>
       <meaning>Excessive or annoying.
       </meaning>
    </idiom>
    <idiom>
         <phrase>A bridge too far</phrase>
   <meaning>Act of overreaching, going too far
        and getting into trouble
        or
        failing.
   </meaning>
    </idiom>
</idioms>

Visual Studio 2010(它创建了架构俄罗斯娃娃样式):

XML文件虽然设置为使用VS2010界面中的模式,但在代码中没有显示?

<?xml version="1.0" encoding="utf-8"?>

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="idioms">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="idiom">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="phrase" type="xs:string" />
                            <xs:element name="meaning" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<?xml version="1.0" encoding="utf-8"?>

<idioms>
    <idiom>
        <phrase>A bit much</phrase>
        <meaning>Excessive or annoying.</meaning>
    </idiom>
    <idiom>
        <phrase>A bridge too far</phrase>
        <meaning>Act of overreaching.</meaning>
    </idiom>
    <idiom>
        <phrase>A chain is no stronger than its weakest link</phrase>
        <meaning>The weakest part of an object is it's strength.</meaning>
    </idiom>
</idioms>

3 个答案:

答案 0 :(得分:3)

您的根元素未正确关闭。

使用</idioms>,而不是<idioms>:)

<强>更新

缺少命名空间可能是问题(在架构和xml中)。

答案 1 :(得分:1)

来自XSD spec

  

由顶级声明验证的元素信息项必须使用该声明的{目标命名空间}进行限定(如果这不存在·,则该项必须是不合格的)。

翻译:

如果你想使用elementFormDefault属性设置为限定(你是否故意选择它?),那么你必须声明一个targetNamespace元素并将其设置为某个URI,然后给出它也是在该命名空间中声明的XML。所以,像

<xsd:schema targetNamespace="urn:so:example" attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
</xsd:schema>

在xml中使用该命名空间:

<idioms xmlns="urn:so:example">
  <idiom>
    <phrase>A bit much</phrase>
    <meaning>Excessive or annoying.</meaning>
  </idiom>
  <idiom>
    <phrase>A bridge too far</phrase>
    <meaning>Act of overreaching.</meaning>
  </idiom>
</idioms>

或者,我认为你可以完全从scheme标签中删除elementFormDefault属性。它的默认值是不合格的。

答案 2 :(得分:0)

我使用VS2010从我的XML生成XML模式。在这样做时,它似乎忽略了(私有)命名空间,但它确实将UI中的模式设置为它刚刚生成的XML模式的名称。

此外,它没有在XML本身中显示它使用或包含此XML模式。

这是因为XML和XSD文件都具有相同的基本名称(EnglishIdioms。),并且这两个文件都在同一目录中吗?