Могу ли я использовать xsd: complexContent с Мастером привязки Delphi XML? - PullRequest
2 голосов
/ 19 мая 2009

Мастеру привязки данных XML Delphi 2009 не удается обработать простой XSD, который содержит объявление complexContent (недействительная операция указателя).

Это ошибка или известное ограничение?

Пример:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema targetNamespace="http://example.org/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">

  <xsd:complexType name="TestType">
    <xsd:complexContent>
      <xsd:restriction base="xsd:anyType">
        <xsd:attribute name="Name" type="xsd:string"/>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>

</xsd:schema>

Редактировать: другие примеры работают нормально, поэтому похоже, что часть определения complexContent вызывает ошибку. Рабочий пример:

<xsd:complexType name="pc-Typ">
  <xsd:sequence>
    <xsd:element name="name"       type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:integer"/>
</xsd:complexType>

<xsd:complexType name="myPC-Typ">
  <xsd:complexContent>
    <xsd:extension base="pc-Typ">
      <xsd:sequence>
        <xsd:element name="ram" type="xsd:integer"/>
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

Ответы [ 4 ]

2 голосов
/ 13 июня 2009

Могу ли я использовать xsd: complexContent с Мастером привязки Delphi XML?

Да, xsd:complexContent можно использовать.

Я знаю, что у Delphi есть свои недостатки, но я не виню Delphi за эту схему. XSD - это богатый язык схем, как и класс OO Delphi. Части двух миров пересекаются, но есть части, которые не будут. Привязка данных XML - это процесс преобразования схемы XML в структуру классов OO, поэтому схема должна быть достаточно конкретной, чтобы быть выраженной в виде класса.

В этом примере вы говорите, что TestType соответствует любому типу, если у него есть атрибут string с именем Name. Валидатор XML может подойти для такого определения, но его трудно определить в модели с одним наследованием, поскольку foo:Animal, foo:Plant и foo:Mineral могут иметь атрибут Name.

Я определил пустой complexType с именем TestBaseType, и этот класс сгенерирован совершенно нормально.

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema targetNamespace="http://example.org/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">

  <xsd:complexType name="TestBaseType">
    <xsd:sequence>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="TestType">
    <xsd:complexContent>
      <xsd:restriction base="TestBaseType">
        <xsd:attribute name="Name" type="xsd:string"/>
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

Это сгенерировало следующий код:

unit test;

interface

uses xmldom, XMLDoc, XMLIntf;

type

{ Forward Decls }

  IXMLTestBaseType = interface;
  IXMLTestType = interface;

{ IXMLTestBaseType }

  IXMLTestBaseType = interface(IXMLNode)
    ['{0FBC1D84-DA5E-4315-83A9-B5FFE9528969}']
  end;

{ IXMLTestType }

  IXMLTestType = interface(IXMLTestBaseType)
    ['{12E35067-516F-4457-8C62-4131CA60D706}']
    { Property Accessors }
    function Get_Name: WideString;
    procedure Set_Name(Value: WideString);
    { Methods & Properties }
    property Name: WideString read Get_Name write Set_Name;
  end;

{ Forward Decls }

  TXMLTestBaseType = class;
  TXMLTestType = class;

{ TXMLTestBaseType }

  TXMLTestBaseType = class(TXMLNode, IXMLTestBaseType)
  protected
    { IXMLTestBaseType }
  end;

{ TXMLTestType }

  TXMLTestType = class(TXMLTestBaseType, IXMLTestType)
  protected
    { IXMLTestType }
    function Get_Name: WideString;
    procedure Set_Name(Value: WideString);
  end;

implementation

{ TXMLTestBaseType }

{ TXMLTestType }

function TXMLTestType.Get_Name: WideString;
begin
  Result := AttributeNodes['Name'].Text;
end;

procedure TXMLTestType.Set_Name(Value: WideString);
begin
  SetAttribute('Name', Value);
end;

end.
1 голос
/ 08 июня 2009

Я играл с D2007, и, похоже, проблемы с xsd: anyType тоже есть. Не знаю, как решить эту проблему. Я знаю, что у Delphi всегда были незначительные проблемы с его функцией синтаксического анализа XML. До D7 он даже не соответствовал стандарту XML. Так что считайте это еще одним недостатком в Delphi. При использовании XML в моих приложениях Delphi я просто игнорирую этот мастер XML и просто импортирую вместо него библиотеку типов MSXML, пишу свой собственный код, чтобы обернуть вокруг файлы XML. Это занимает немного больше времени, но это решило много проблем для моего кода. Для одного проекта я даже сделал немного иначе, создав модуль .NET в качестве оболочки для XML-файла, импортировав эту оболочку в качестве COM-объекта в мой проект Delphi, чтобы задействовать все его функциональные возможности. Это было более эффективно и довольно быстро.

Мне нравится Delphi, и он был моим первым выбором в качестве языков разработки с того дня, когда он заменил Turbo / Borland Pascal, но в настоящее время конкуренция (например, .NET) стала столь же мощной в использовании.

1 голос
/ 09 июня 2009

Лучше всего даже не использовать мастер связывания данных XML. Я начал использовать его, но нашел его довольно неподходящим для многих XML, с которыми я работаю. Затем я начал использовать IXMLDocument и IXMLNode напрямую, и они были немного лучше, но все же не особенно хороши с точки зрения производительности и дизайна. Затем я переключился на libxml2 и с тех пор пользуюсь им.

0 голосов
/ 20 мая 2009

Подтверждено, что ваш первый пример отлично разбирается в xmllint.

Я был удивлен, увидев xsd:NCName, поскольку я склонен думать об этом как о внутреннем использовании - но, конечно, вы можете использовать его Я думаю, что разработчики Dephi, возможно, сделали то же самое предположение. Попробуйте изменить его на xsd:string, чтобы сузить его.

И, конечно же, почему бы не опубликовать это на официальном форуме Dephi? (Я уверен, что это существует). Они могут это исправить или иметь обходной путь.


Кстати: это упрощает тестирование XSD, если вы создаете полную схему - тогда может быть быстрее получить ответы, поскольку другим не нужно добавлять в тег.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...