【问题标题】:XML mapper... XE2XML 映射器... XE2
【发布时间】:2011-12-28 10:11:08
【问题描述】:

我有一个来自 Web 服务的 xml,我想将其存储在 ClientDataSet 中。

使用 XML 映射器时,网格中不显示任何数据(使用 “创建和测试转换”),所以我无法使用 转换文件...

这是来自 C# Webservice 的一些响应 XML(一行数据)...

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<AllResponse xmlns="http://some.url.com/">
<AllResult>
<xs:schema xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="NewDataSet">
<xs:element msdata:UseCurrentLocale="true" msdata:IsDataSet="true" name="NewDataSet">
<xs:complexType>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="Table">
<xs:complexType>
<xs:sequence>
<xs:element name="Id" minOccurs="0" type="xs:string"/>
<xs:element name="UserName" minOccurs="0" type="xs:string"/>
<xs:element name="Name" minOccurs="0" type="xs:string"/>
<xs:element name="PhoneInt" minOccurs="0" type="xs:string"/>
<xs:element name="CostCentre" minOccurs="0" type="xs:int"/>
<xs:element name="GroupRoleNameDK" minOccurs="0" type="xs:string"/>
<xs:element name="GroupRoleNameUK" minOccurs="0" type="xs:string"/>
<xs:element name="Email" minOccurs="0" type="xs:string"/>
<xs:element name="Url" minOccurs="0" type="xs:string"/>
<xs:element name="PhoneAlt" minOccurs="0" type="xs:string"/>
<xs:element name="PhoneMobile" minOccurs="0" type="xs:string"/>
<xs:element name="Fax" minOccurs="0" type="xs:string"/>
<xs:element name="EducationNameDK" minOccurs="0" type="xs:string"/>
<xs:element name="EducationNameUK" minOccurs="0" type="xs:string"/>
<xs:element name="Location" minOccurs="0" type="xs:string"/>
<xs:element name="PhoneNote" minOccurs="0" type="xs:string"/>
<xs:element name="Personid" minOccurs="0" type="xs:int"/>
<xs:element name="GroupId" minOccurs="0" type="xs:int"/>
<xs:element name="GroupNameDK" minOccurs="0" type="xs:string"/>
<xs:element name="GroupNameUK" minOccurs="0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet xmlns="">
<Table diffgr:id="Table1" msdata:rowOrder="0">
<Id>P-4</Id>
<UserName>auser</UserName>
<Name>Somename</Name>
<PhoneInt>aPhone</PhoneInt>
<CostCentre>0</CostCentre>
<GroupRoleNameDK>WebService</GroupRoleNameDK>
<GroupRoleNameUK>WebService</GroupRoleNameUK>
<Email>aname@acompany.com</Email>
<Url>http://www.embarcadero.com</Url>
<PhoneMobile>12345678</PhoneMobile>
<Fax>87654321</Fax>
<Personid>4</Personid>
<GroupId>618</GroupId>
<GroupNameDK>Danish Group</GroupNameDK>
<GroupNameUK>GroupName</GroupNameUK>
</Table>
</NewDataSet>
</diffgr:diffgram>
</AllResult>
</AllResponse>
</soap:Body>
</soap:Envelope>

schema 似乎定义得很好,所以我有点疑惑,为什么会这样 不起作用。 我注意到有些字段有 而不是 当字段为空时 - 不知道这是否重要...

知道我是怎么相处的吗?

-库尔特

【问题讨论】:

    标签: xml web-services delphi soap delphi-xe2


    【解决方案1】:

    响应包含两部分,一个类似于 XSD 文档中的 XML 模式定义和一个数据部分。

    如果 XE2 中的 XML 数据绑定向导不喜欢这种格式,我会

    • 提取架构部分(一次)并从中创建一个可由向导处理的 XSD

    • 从 XML 文档中提取数据部分(针对每个响应)并将其提供给转换组件

    【讨论】:

    • @Kurt 要提取数据部分,我会将 XML 读入 IXmlDocument。然后将 Table 元素(及其子节点)加载到 IXmlNode 中,并将其添加到第二个(空)IXmlDocument。
    【解决方案2】:

    答案是我需要在第一行更改 .XTR 文件 见Deepak的文章http://www.agnisoft.com/white_papers/soap1.asp

    引用:

    原因是 Delphi 的 XML 转换提供程序没有 就像“from”属性的第一个元素中的“soap:”(和 “源”中的所有此类命名空间)。这可能会在某些情况下得到解决 更新包,所以这一点可能不适用

    这在 Delphi XE2 中没有修复...

    -库尔特

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      相关资源
      最近更新 更多