自从我搞乱模式以来,我已经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>
答案 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。),并且这两个文件都在同一目录中吗?