Posso usar xsd: complexContent com o XML Delphi Assistente de ligação?

votos
2

O Assistente de ligação de dados XML Delphi 2009 não consegue processar um XSD simples que contém uma declaração complexContent (ponteiro inválido Operação).

É um bug ou uma limitação sabe?

Exemplo:

<?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: outros exemplos funcionar bem, por isso parece uma parte da definição complexContent causa o erro. Exemplo de trabalho:

<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>
Publicado 19/05/2009 em 16:31
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

Posso usar xsd: complexContent com o XML Delphi Assistente de ligação?

Sim, xsd:complexContentpode ser usado.

Eu sei Delphi tem suas falhas, mas eu não culpo Delphi para este esquema. XSD é uma linguagem de esquema rico, e por isso é de classe OO da Delphi. Partes de dois mundos se sobrepõem, mas há partes que não vai. ligação de dados XML é um acto de traduzir um esquema XML em estrutura de classe OO, de modo que o esquema tem de ser suficiente para betão ser expressa como classe.

Neste exemplo, você está dizendo que TestTypecorresponde a qualquer tipo desde que tem um stringatributo chamado Name. Um validador XML pode ser ok com esse tipo de definição, mas é difícil de definir que, em um modelo de herança simples, uma vez foo:Animal, foo:Plante foo:Mineraltudo isso pode ter Nameatributo.

I definido um complexType vazia chamada TestBaseTypee que classe gerada perfeitamente bem.

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

Isto gerou o seguinte código:

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.
Respondeu 13/06/2009 em 03:39
fonte usuário

votos
1

Você é melhor fora nem mesmo usando o assistente de ligação de dados XML. Eu comecei a usá-lo, mas achei bastante inadequados para muitos XML que eu trabalho. Então eu comecei a usar IXMLDocument e IXMLNode diretamente, e eles foram um pouco melhor, mas ainda não bem particular por motivos de desempenho e design. Então eu mudei para libxml2 e foram utilizá-lo desde então.

Respondeu 09/06/2009 em 02:21
fonte usuário

votos
1

Estive jogando com D2007 e parece ter problemas com xsd: anyType também. Não conheço nenhuma solução para este problema, no entanto. Eu sei que a Delphi sempre teve problemas menores com a sua funcionalidade de análise XML. Até D7, não foi ainda verdadeiramente compatível com o padrão XML. Por isso, considero que apenas uma outra falha no Delphi. Ao usar XML em minhas aplicações Delphi, eu só estou ignorando esse assistente XML e apenas importar a biblioteca de tipos MSXML em vez disso, escrever meu próprio código para envolver em torno de arquivos XML. É preciso um pouco mais de tempo, mas ele resolveu uma série de problemas para o meu código. Para um projeto, eu mesmo fiz as coisas um pouco diferentes, criando um módulo .NET como invólucro em torno de um arquivo XML, importando esse wrapper como um objeto COM no meu projeto Delphi para invocar toda a sua funcionalidade. Era mais eficaz e bastante rápido também.

Eu amo Delphi e tem sido a minha primeira escolha como linguagens de desenvolvimento desde o dia em que substituiu Turbo / Borland Pascal, mas hoje em dia a competição (.NET, por exemplo) tornou-se tão poderosa para usar.

Respondeu 08/06/2009 em 13:27
fonte usuário

votos
0

Confirmou seu primeiro exemplo analisa muito bem em xmllint.

Fiquei surpreso ao ver xsd:NCName, como eu tendem a pensar nela como apenas para uso interno - mas é claro que você pode usá-lo. Estou pensando os implementadores Dephi pode ter feito a mesma suposição. Tente mudá-lo para xsd:string, para ajudar a reduzi-lo.

E - é claro - por que não postar isso no fórum Dephi oficial? (Eu tenho certeza que ela existe) Eles podem corrigi-lo, ou ter uma solução alternativa.


BTW: ele torna mais fácil para testar XSD de se tornar um esquema completo - pode ser mais rápido para obter respostas, em seguida, como outros não precisa adicionar a tag.

Respondeu 20/05/2009 em 05:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more