Как получить доступ к частицам сложного типа в msxml6 с помощью Delphi? - PullRequest
2 голосов
/ 20 сентября 2011

Я получил «неверный параметр» при доступе к частям в contentmodel, но можно читать itemtype. Может кто-нибудь сказать мне, что делать? Заранее спасибо.

//Book.xsd
<xs:schema xmlns="urn:bookstore-schema" targetNamespace="urn:bookstore-schema"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="book" type="booktype" />
 <xs:complexType name="booktype">
   <xs:sequence>
     <xs:element name="author" type="xs:string" />
     <xs:element name="price" type="xs:decimal" />
     <xs:element name="aaa" type="xs:string" />
   </xs:sequence>
</xs:complexType>
<xs:element name="another" type="xs:string" />

procedure AccessSchema;
var oSchemaCache : XMLSchemaCache60;
    oSchema : ISchema;
    nsTarget : string;
    kk : integer;

 procedure AccessComplexType(oComplex : iSchemaItem);
 var ISchComplex : ISchemaComplexType;
 begin
    ISchComplex := oComplex as ISchemaComplexType;

    if (iSchComplex.contentType = SCHEMACONTENTTYPE_MIXED) or
       (iSchComplex.contentType = SCHEMACONTENTTYPE_ELEMENTONLY) then
    begin
       if (iSchComplex.contentModel.ItemType = SOMITEM_CHOICE) or
          (iSchComplex.contentModel.ItemType = SOMITEM_SEQUENCE) then
       begin
         if IschComplex.contentModel.particles.length > 0 then  
         //error : the parameter is incorrect
        begin
           {handling particles }
        end;
      end;
    end;
 end; 

begin
  oSchemaCache := coXMLSchemaCache60.Create;

  nsTarget := 'urn:bookstore-schema';
  oSchemaCache.add(nsTarget,'c:\book.xsd');
  oSchema := oSchemaCache.getSchema(nsTarget);

   for kk := 0 to pred( oschema.types.length) do
   begin
      if (oschema.types.item[kk].itemType = SOMITEM_COMPLEXTYPE ) then
        AccessComplexType(oschema.types.item[kk]);
   end;

конец;

1 Ответ

2 голосов
/ 20 сентября 2011

Проблема не в вашем коде, проблема в неисправном импортере TLB Delphi 7.

За исключением того факта, что вы забыли включить закрывающий тег xs:schema, ваш пример работает очень хорошо , если я скопирую и вставлю его в Delphi 2010 .

Назад к Delphi 7 .Доступ к свойству .particles contentModel возвращает код OLE $ 80004001.

Беглый взгляд на сгенерированный TLB.pas показывает, что Delphi 7 облажался при импорте файла .TLB.contentModel имеет тип ISchemaModelGroup, который наследуется от ISchemaItem.Теперь взгляните на определение:

  ISchemaParticle = interface(ISchemaItem)
    ['{50EA08B5-DD1B-4664-9A50-C2F40F4BD79A}']
    procedure GhostMethod_ISchemaParticle_0_1; safecall;
    procedure GhostMethod_ISchemaParticle_4_2; safecall;
    procedure GhostMethod_ISchemaParticle_8_3; safecall;
    procedure GhostMethod_ISchemaParticle_12_4; safecall;
    procedure GhostMethod_ISchemaParticle_16_5; safecall;
    procedure GhostMethod_ISchemaParticle_20_6; safecall;
    procedure GhostMethod_ISchemaParticle_24_7; safecall;
    procedure GhostMethod_ISchemaParticle_28_8; safecall;
    procedure GhostMethod_ISchemaParticle_32_9; safecall;
    procedure GhostMethod_ISchemaParticle_36_10; safecall;
    procedure GhostMethod_ISchemaParticle_40_11; safecall;
    procedure GhostMethod_ISchemaParticle_44_12; safecall;
    procedure GhostMethod_ISchemaParticle_48_13; safecall;
    procedure GhostMethod_ISchemaParticle_52_14; safecall;
    function Get_minOccurs: OleVariant; safecall;
    function Get_maxOccurs: OleVariant; safecall;
    property minOccurs: OleVariant read Get_minOccurs;
    property maxOccurs: OleVariant read Get_maxOccurs;
  end;

Видите все эти методы ghost_xxx?Delphi 2010 не генерирует их, и они не должны быть там во-первых (они приводят к тому, что смещение метода для вызова get_particles все неправильно).

Просто прокомментируйте эти методы GhostMethod_XXX в MSXML2_TLB иваш пример работает как брелок.

Однако вы все еще застряли с плохо импортированным TLB, который может взорваться вам в лицо в любое время.Я бы посоветовал вам использовать импортированную версию Delphi 2010 вместо ( MSXML2_TLB.zip ), так как она отлично работает с Delphi 7.

...