只是想知道我是否可以尝试编写架构 我有以下节点
> <Persons>
> <Person system="FirstName">Joe</category>
> <Person system="Surname">Doe</category>
> <Person system="Phone">123456</category>
> <Person system="Phone">789123</category>
> </Persons>
我试过这个
<xsd:element Name="Persons" sql:isconstant="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" Name="Person">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute Name="FirstName"
Type="xsd:string"
sql:field="PersonsFirstName" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
当我运行时,我收到以下错误
名称包含无效字符。
非常感谢任何帮助或指示。提前谢谢。
答案 0 :(得分:0)
我没有看到您显示的片段中包含无效字符的任何名称,这表明
或
name
和type
拼写错误Name
和Type
(XML区分大小写,是吗?)及其诊断消息而感到困惑。 ..没有你想象的那么有用。[稍后添加]您可能会发现在具有XSD结构内置知识的编辑器中处理模式文档会很有帮助;这有助于防止简单的错误。如果您提供一个允许重现问题的最小但完整的示例,将更容易为您提供帮助。 (当我在模式文档中嵌入元素声明并更正@name和@type的拼写时,我没有得到关于xsd:attribute的任何错误。没有可重现的示例,Stack Overflow的Q / A格式退化一个二十个问题的游戏,这在现场直播时会更有趣。)
更仔细地查看您的架构片段我注意到您定义的XML结构与输入的结构不匹配:您的架构定义了一个名为FirstName
的属性,但输入你show没有这样的属性;输入有一个无用的名为System
的属性,可以将FirstName
作为值。
如果你想匹配你显示的输入,你需要声明类似下面的形式(我留下sql的管理:*注释给你;我已经扁平化了结构,因为深嵌套似乎这么多人更难理解架构,包括我):
<xsd:element name="Persons">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Person" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Person">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="System" type="xsd:NCName"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
另一方面,如果你真的需要模式来指定如何将每个元素映射到一个列中(我猜测你的sql:field属性正在做什么),你会发现它更容易如果你使XML元素类型名称更明确地说明它们是什么。如果XML看起来像这样:
<Persons>
<Person>
<FirstName>Joe</FirstName>
<Surname>Doe</Surname>
<Phone>123456</Phone>
<Phone>789123</Phone>
</Person>
<!--* ... other Person records here *-->
</Persons>
然后将每个字段映射到不同的SQL字段会更简单。
但是我不熟悉你的架构中的注释,我可能误解了它们的功能。