SelectSingleNode IXMLDOMNode
У меня есть файл XML, и я читаю его с помощью SelectSingleNode в IXMLDOMNode. (Дельфи-XE3)
XMLResult: IXMLDOMNode;
XMLResult.xml ниже
<redlineaudit>
<doclist>
<doc id="0" order="0"/>
<doc id="1" order="1"/>
</doclist>
<report>
<redlineparagraph index="0" id="0" sourcedocid="0" cellrow="-1" cellcol="-1">
<operation index="0" value="insert"/>
<operation index="1" value="insert"/>
<move index="0" value="0"/>
<move index="1" value="0"/>
</redlineparagraph>
<redlinephraselist index="0" phrasehassomeworddifferences="false">
<sourceparaid index="0" value="0"/>
<sourceparaid index="1" value="1"/>
<phrases>
<phrase index="0">
<phraseversion index="0" deletedocid="-1" moved="false" sourcedocid="0" phrasehassomeworddifferences="false">
<wordproperties>
<wordproperty index="0" id="0" hasworddifference="false"/>
<wordproperty index="1" id="1" hasworddifference="false"/>
<wordproperty index="2" id="2" hasworddifference="false"/>
<wordproperty index="3" id="3" hasworddifference="false"/>
<wordproperty index="4" id="4" hasworddifference="false"/>
<wordproperty index="5" id="5" hasworddifference="false"/>
</wordproperties>
</phraseversion>
</phrase>
<phrase index="1">
<phraseversion index="0" deletedocid="-1" moved="false" sourcedocid="1" phrasehassomeworddifferences="false">
<wordproperties>
<wordproperty index="0" id="6" hasworddifference="false"/>
<wordproperty index="1" id="7" hasworddifference="false"/>
</wordproperties>
</phraseversion>
</phrase>
<phrase index="2">
<phraseversion index="0" deletedocid="-1" moved="false" sourcedocid="0" phrasehassomeworddifferences="false">
<wordproperties>
<wordproperty index="0" id="6" hasworddifference="false"/>
</wordproperties>
</phraseversion>
</phrase>
</phrases>
<references/>
</redlinephraselist>
<redlineparagraph index="1" id="1" sourcedocid="0" cellrow="-1" cellcol="-1">
<operation index="0" value="insert"/>
<operation index="1" value="insert"/>
<move index="0" value="0"/>
<move index="1" value="0"/>
</redlineparagraph>
<redlinephraselist index="0" phrasehassomeworddifferences="false">
<sourceparaid index="0" value="0"/>
<sourceparaid index="1" value="1"/>
<phrases>
<phrase index="0">
<phraseversion index="0" deletedocid="-1" moved="false" sourcedocid="0" phrasehassomeworddifferences="false">
<wordproperties>
<wordproperty index="0" id="0" hasworddifference="false"/>
<wordproperty index="1" id="1" hasworddifference="false"/>
<wordproperty index="2" id="2" hasworddifference="false"/>
<wordproperty index="3" id="3" hasworddifference="false"/>
<wordproperty index="4" id="4" hasworddifference="false"/>
<wordproperty index="5" id="5" hasworddifference="false"/>
</wordproperties>
</phraseversion>
</phrase>
<phrase index="1">
<phraseversion index="0" deletedocid="-1" moved="false" sourcedocid="1" phrasehassomeworddifferences="false">
<wordproperties>
<wordproperty index="0" id="6" hasworddifference="false"/>
<wordproperty index="1" id="7" hasworddifference="false"/>
</wordproperties>
</phraseversion>
</phrase>
<phrase index="2">
<phraseversion index="0" deletedocid="-1" moved="false" sourcedocid="0" phrasehassomeworddifferences="false">
<wordproperties>
<wordproperty index="0" id="6" hasworddifference="false"/>
</wordproperties>
</phraseversion>
</phrase>
</phrases>
<references/>
</redlinephraselist>
</report>
</redlineaudit>
У меня вопрос, как я могу прочитать каждый элемент в цикле?
индекс красной строки = 0 индекс операции = 0
индекс операции = 1
значение операции = 'вставить'
индекс красной линии
sourceparaid index = 0
индекс красной строки = 1
индекс операции = 0
индекс операции = 1
значение операции = 'вставить'
индекс красной линии
sourceparaid index = 0
.......
Спасибо...
1 ответ
Решение
Ваш пример списка не имеет большого смысла для меня, но это может быть так:
uses
MSXML;
procedure ListValues(const FileName: string; Strings: TStrings);
var
I, J: Integer;
Document: IXMLDOMDocument;
AttributeNode: IXMLDOMNode;
ReportSubnodes: IXMLDOMNodeList;
OperationNodes: IXMLDOMNodeList;
ParameterNodes: IXMLDOMNodeList;
begin
Document := CoDOMDocument.Create;
if Assigned(Document) and Document.load(FileName) then
begin
// select all direct child nodes of the redlineaudit/report/ node
ReportSubnodes := Document.selectNodes('//redlineaudit/report/node()');
// check if the redlineaudit/report/ node was found and if so, then...
if Assigned(ReportSubnodes) then
begin
// lock the output string list for update
Strings.BeginUpdate;
try
// iterate all direct children of the redlineaudit/report/ node
for I := 0 to ReportSubnodes.length - 1 do
begin
// try to find the "index" attribute of the iterated child node
AttributeNode := ReportSubnodes[I].attributes.getNamedItem('index');
// and if the "index" attribute is found, add a line to the list
if Assigned(AttributeNode) then
Strings.Add(Format('%s index = %s', [ReportSubnodes[I].nodeName, AttributeNode.nodeValue]));
// select all "operation" child nodes of the iterated child node
OperationNodes := ReportSubnodes[I].selectNodes('.//operation');
// if some were found, then...
if Assigned(OperationNodes) then
begin
// iterate those "operation" nodes
for J := 0 to OperationNodes.length - 1 do
begin
// and again, try to find the the "index" attribute
AttributeNode := OperationNodes[J].attributes.getNamedItem('index');
// if there is an "index" attribute, then...
if Assigned(AttributeNode) then
begin
// add an item to the output list
Strings.Add(Format('%s index = %s', [OperationNodes[J].nodeName, AttributeNode.nodeValue]));
// if the "index" attribute value is "1", then...
if AttributeNode.nodeValue = '1' then
begin
// find the "value" attribute
AttributeNode := OperationNodes[J].attributes.getNamedItem('value');
// if there is a "value" attribute, add an item to the output list
if Assigned(AttributeNode) then
Strings.Add(Format('%s value = ''%s''', [OperationNodes[J].nodeName, AttributeNode.nodeValue]));
end;
end;
end;
end;
// select all "sourceparaid" child nodes of the iterated child node
ParameterNodes := ReportSubnodes[I].selectNodes('.//sourceparaid');
// if some were found, then...
if Assigned(ParameterNodes) then
begin
// iterate those "sourceparaid" nodes
for J := 0 to ParameterNodes.length - 1 do
begin
// and again, try to find the the "index" attribute
AttributeNode := ParameterNodes[J].attributes.getNamedItem('index');
// if there is an "index" attribute and this attribute has value "0",
// add an item to the output list
if Assigned(AttributeNode) and (AttributeNode.nodeValue = '0') then
Strings.Add(Format('%s index = %s', [ParameterNodes[J].nodeName, AttributeNode.nodeValue]));
end;
end;
end;
finally
// unlock the output string list for update
Strings.EndUpdate;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListValues('c:\File.xml', Memo1.Lines);
end;
Я получил этот результат из вашего XML-файла, используя приведенный выше код: