我有以下XML。
<ArrayOfRapJ xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/pluriel.Models">
<Rapj>
<Libdep>% Fréquentation:</Libdep>
<Total>36.860068259385665529010238910</Total>
</Rapj>
我使用以下Delphi代码来阅读<Libdep>
和<Total>
值:
var
DOC: IXMLDocument;
i: Integer;
OrderChilds, E1EDP01_Node: IXMLNode;
begin
DOC := LoadXMLDocument('d:\Rapjrnprests.xml');
for i := 0 to DOC.ChildNodes.Nodes['ArrayOfRapJ'].ChildNodes.Count - 1 do
begin
OrderChilds := DOC.ChildNodes.Nodes['RapJ'].ChildNodes[i];
if OrderChilds.NodeName = 'RapJ' then
begin
E1EDP01_Node := OrderChilds.ChildNodes.Nodes['Libdep'];
if Assigned(E1EDP01_Node) then
Memo1.Lines.Add(E1EDP01_Node.ChildNodes.Nodes['Total'].NodeValue)
end;
end;
XML正在使用URL命名空间。我如何阅读这些值?
答案 0 :(得分:0)
您的代码对于您显示的XML是不正确的,即使不考虑名称空间也是如此。
尝试更像这样的东西:
var
Doc: IXMLDocument;
i: Integer;
Arr, Node: IXMLNode;
Libdep, Total: string;
begin
Memo1.Clear;
Doc := LoadXMLDocument('d:\Rapjrnprests.xml');
// assuming <RapJArray> is the top-most element of the XML...
Arr := Doc.DocumentElement;
for i := 0 to Arr.ChildNodes.Count - 1 do
begin
Node := Arr.ChildNodes.Nodes[i];
if (Node.NodeName = 'RapJ') {and (Node.NamespaceURI = 'http://schemas.datacontract.org/2004/07/pluriel.Models')} then
begin
Libdep := VarToStr(Node.ChildValues['Libdep']);
Total := VarToStr(Node.ChildValues['Total']);
if (Libdep <> '') and (Total <> '') then
Memo1.Lines.Add(Libdep + ' ' + Total);
end;
end;
end;
答案 1 :(得分:0)
首先,你有一个简单的拼写错误。 XML区分大小写;你的XML包含(注意小写的j),而你的代码包含RapJ(注意大写的J)。代码必须完全匹配XML。
你的代码中也有一些不当处理。这是一个(非常简化的)工作示例(在XE7中测试)。
// Used in order to avoid creating a disk file. XML unchanged from
// question except for adding the closing </ArrayOfRapJ> element,
// which was missing
const
XMLText = '<ArrayOfRapJ xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/pluriel.Models">' +
' <Rapj>' +
' <Libdep>% Fréquentation:</Libdep>' +
' <Total>36.860068259385665529010238910</Total>' +
' </Rapj>' +
'</ArrayOfRapJ>';
procedure TForm5.Button1Click(Sender: TObject);
var
Doc: IXMLDocument;
DocNode: IXMLNode;
Node: IXMLNode;
i: Integer;
begin
Doc := LoadXMLData(XMLText);
DocNode := Doc.ChildNodes[0];
for i := 0 to DocNode.ChildNodes.Count - 1 do
begin
Node := DocNode.ChildNodes[i];
if Node.NodeName = 'Rapj' then
begin
Memo1.Lines.Add(Node.ChildNodes['Libdep'].Text);
Memo1.Lines.Add(Node.ChildNodes['Total'].Text);
end
else
Memo1.Lines.Add('Skipped node ' + Node.NodeName);
end;
end;