Ver Mensaje Individual
  #3  
Antiguo 17-12-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Javier.

La estructura de ese archivo es bastante sencilla, y combinando TghXMLDoc con XPath es muy fácil leer los datos.

Preparé este ejemplo pensando en tu caso:
Código Delphi [-]
uses
  Forms, DB, DBClient, Controls, Grids, DBGrids, StdCtrls, Classes,
  GHFXMLDoc;

type
  TForm1 = class(TForm)
    mm1: TMemo;
    mm2: TMemo;
    Label1: TLabel;
    Button1: TButton;
    gr1: TDBGrid;
    ds1: TDataSource;
    dt1: TClientDataSet;
    dt1ID: TStringField;
    dt1Nombre: TStringField;
    dt1Subclase: TStringField;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Doc :TghXMLDoc;  // Variable para manejar el documento XML
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Uses
  GHFRTL;

procedure TForm1.FormCreate(Sender: TObject);
begin
  { Abrimos el archivo Objetos.xml que se encuentra en el mismo directorio
    que este programa (la función ghDirPath devuelve una ruta de archivo
    con base en la ruta del programa ejecutable) }
  Doc := TghXMLDoc.Create (ghDirPath ('Objetos.xml'));

  { Mostramos su contenido dentro del cuadro de texto mm1 (el método
    FormatContent devuelve el contenido XML pero con saltos de línea y
    sangrado para mejor legibilidad) }
  mm1.Text := Doc.FormatContent;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Doc.Free;  // Cerramos el documento XML y destruimos el objeto Doc
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
  Atributos, Objetos :OLEVariant;
  I, J :Integer;
  Valor :String;
begin
  { Del archivo XML, obtenemos una lista de todos los elementos de nombre
    "UDSObject" (registros objeto) }
  Objetos := Doc.Nodes ('//UDSObject');

  mm2.Clear;
  mm2.Lines.Add ('Número de objetos: ');
  mm2.Lines.Add (Objetos.Length);
  mm2.Lines.Add ('');
  mm2.Lines.Add ('Identificadores de cada objeto: ');

  // Desplegamos el valor del elemento Handle de cada elemento UDSObject
  For I := 0 To Objetos.Length - 1 Do
    mm2.Lines.Add (Objetos.Item (I).SelectSingleNode ('Handle').Text);

  mm2.SetFocus;
  mm2.SelStart := 0;
  mm2.SelLength := 0;
  dt1.EmptyDataSet;

  // Llenamos un conjunto de datos con los registros XML de objetos
  For I := 0 To Objetos.Length - 1 Do
  Begin
    dt1.Append;

    { Obtenemos la lista de atributos del objeto I (todos los elementos
      "Attribute" hijos del elemento "Attributes" del objeto en turno) }
    Atributos := Objetos.Item (I).SelectNodes ('Attributes/Attribute');

    For J := 0 To Atributos.Length - 1 Do
    Begin
      // Valor del atributo/campo
      Valor := Atributos.Item (J).SelectSingleNode ('AttrValue').Text;

      // Asignación según sea el nombre del atributo
      If Atributos.Item (J).SelectSingleNode ('AttrName').Text =
      'persistent_id' Then
        dt1.FieldByName ('ID').Value := Valor
      Else
        If Atributos.Item (J).SelectSingleNode ('AttrName').Text =
        'name' Then
          dt1.FieldByName ('Nombre').Value := Valor
        Else
          If Atributos.Item (J).SelectSingleNode ('AttrName').Text =
          'resource_subclass' Then
            dt1.FieldByName ('Subclase').Value := Valor;
    End;
  End;

  dt1.First;
end;
Espero te sirva, mi amigo. O ya me dices qué le ajustamos.

Un saludo.
Responder Con Cita