简体   繁体   中英

IXMLDocument unable to read data because IXMLNode.Text property always empty

I'm trying to read XML file with Delphi TXMLDocument parser but I'm unable to reach data in the nodes and I'm not able to figure out why this is happening. The XML is:

<?xml version="1.0" encoding="UTF-8"?>
<types:NotificaScarto xmlns:types="http://www.fatturapa.gov.it/sdi/messaggi/v1.0" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versione="1.0" xsi:schemaLocation="http://www.fatturapa.gov.it/sdi/messaggi/v1.0 MessaggiTypes_v1.0.xsd ">
  <IdentificativoSdI>111</IdentificativoSdI>
  <NomeFile>IT01234567890_11111.xml.p7m</NomeFile>
  <DataOraRicezione>2013-06-06T12:00:00Z</DataOraRicezione>
  <RiferimentoArchivio>
    <IdentificativoSdI>100</IdentificativoSdI>
    <NomeFile>IT01234567890_11111.zip</NomeFile>
  </RiferimentoArchivio>
  <ListaErrori>
    <Errore>
      <Codice>00100</Codice>
      <Descrizione>Certificato di firma scaduto</Descrizione>
    </Errore>
  </ListaErrori>
  <MessageId>123456</MessageId>
  <Note>Note</Note>
</types:NotificaScarto>

I need to read the "DataOraRicezione" node so I'm using this code:

procedure TForm1.Button1Click(Sender: TObject);
var
  XMLD : IXMLDocument;
  N0,N1 : IXMLNode;
begin
  XMLD:=TXMLDocument.Create(Application);
  XMLD.LoadFromFile('d:\IT01131820936_00175_NS_001.xml');  // the XML is on a file
  XMLD.Active:=TRUE;
  N0:=XMLD.ChildNodes['types:NotificaScarto'];
  N1:=N0.ChildNodes['DataOraRicezione'];
  ShowMessage(N1.Text);  // Empty ?????
end;

I suppose that the problem could be related to the schema. I never read till now xml files like these I'm a newbie about it so I'm not capable to read that value. I search for similar answers but I couldn't reach my goal. Am I missing something?

Thank you Davide

In order to read the node value you must use the FindNode method.

function FindNode(NodeName, NamespaceURI: DOMString): IXMLNode; overload;

Like so

  N0:=XMLD.ChildNodes['types:NotificaScarto'];
  N1:=N0.ChildNodes.FindNode('DataOraRicezione', '');
  ShowMessage(N1.Text); 

The NamespaceURI must be blank for this particular case because the namespace is not included in the node itself.

This will return

2013-06-06T12:00:00Z

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM