2009-05-19 1 views
2

Мастер привязки данных XML Delphi 2009 не может обработать простой XSD, содержащий декларацию complexContent (Invalid Pointer Operation).Могу ли я использовать xsd: complexContent с помощью мастера привязки XML Delphi?

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

Пример:

<?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> 

Edit: другие примеры работают хорошо, так это выглядит как часть определения 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> 

ответ

2

Могу ли я использовать XSD: complexContent с XML Delphi Binding Wizard?

Да, 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. 
0

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

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

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


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

+1

Изменена схема как было предложено с тем же результатом. Я также опубликую его в QualityCentral. – mjn

1

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

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^