【问题标题】:IXMLDocument unable to read data because IXMLNode.Text property always emptyIXMLDocument 无法读取数据,因为 IXMLNode.Text 属性始终为空
【发布时间】:2014-07-31 04:57:46
【问题描述】:

我正在尝试使用 Delphi TXMLDocument 解析器读取 XML 文件,但无法访问节点中的数据,并且无法弄清楚为什么会发生这种情况。 XML 是:

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

我需要阅读“DataOraRicezione”节点,所以我正在使用此代码:

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;

我认为问题可能与架构有关。到目前为止,我从未读过像这样的 xml 文件,我是新手,所以我无法读取该值。我寻找类似的答案,但我无法达到我的目标。我错过了什么吗?

谢谢 大卫

【问题讨论】:

  • 不确定它是否有帮助,但测试您的代码和数据我看到了两件事:a) 我无法访问 XSD。不确定您是否需要某种许可。 b) 如果您删除所有标头属性和types 前缀,问题就会消失,即您将根节点保留为NotificaScarto
  • 我刚刚看到删除标题属性然后一切正常,但在我的上下文中它不是一个可接受的解决方案。现在我将研究 xsd 的可访问性。谢谢!

标签: xml delphi xsd


【解决方案1】:

为了读取节点值,您必须使用FindNode 方法。

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

像这样

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

对于这种特殊情况,NamespaceURI 必须为空,因为命名空间不包含在节点本身中。

这将返回

2013-06-06T12:00:00Z

【讨论】:

  • +1,这行得通。 FindNode 中的第二个参数是我在测试中缺少的。除了那个参数,我有完全相同的代码。 :-)
  • +1,这也适用于我!我不太了解原因,但它有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多