我正在使用XML数据映射,并在使用它时生成复杂类型时遇到问题。
如果我有一个类似下面的XML工作正常
<?xml version="1.0" standalone="yes" ?>
<Sample>
<connection>
<item Name="ABC">123</item>
<item Name="XYZ">123</item>
<item Name="MNO">123</item>
</connection>
<connection>
<item Name="ABC">123</item>
<item Name="XYZ">123</item>
<item Name="MNO">123</item>
</connection>
</Sample>
我的复杂类型为SampleType, ConnectionType and ItemType
。
但如果我有像
那样的XML<?xml version="1.0" standalone="yes" ?>
<Sample>
<connection>
<item Name="ABC"/>
<item Name="XYZ"/>
<item Name="MNO"/>
</connection>
<connection>
<item Name="ABC"/>
<item Name="XYZ"/>
<item Name="MNO"/>
</connection>
</Sample>
我得到的复杂类型为SampleType, ConnectionType, ItemType, ItemType2, ItemType22, ItemType222, ItemType2222, and ItemType22222
,即ItemTypes等于XML中存在的项目数。
为什么会这样,我该如何解决这个问题?
答案 0 :(得分:2)
这是因为数据映射器并不是要从XML文件(或更好的措辞XML文档)推断出数据,而是来自XML Schema。
XML Schema描述了XML文档应遵循的语法。
XML模式可以存储为XSD文件或DTD文件。
因此,您应该采取的第一步是创建XSD架构。 您可以从XML生成XSD开始,然后抛光XSD。
在线XML-2-XSD工具可以帮助您生成该XSD,但还有更多工具。
然后在数据映射器中使用该XSD,你就有更好的机会。
注意:XML类型的定义与大多数编程语言不同,因此您无法始终将XML数据类型映射到Delphi。你的简单案例会起作用,但只要你在XML中进行递归或null,就会变得非常毛茸茸。
编辑:为两个XML文档添加了XSD示例。
我使用了XmlForAsp to infer the XSD,所以你有一个良好的开端。
第一个和第二个XML文档的推断XSD是相同的:
<?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="Sample" type="SampleType" />
<xsd:complexType name="SampleType">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="connection" type="connectionType" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="connectionType">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="item" type="itemType" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="itemType">
<xsd:attribute name="Name" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
- 的Jeroen