SelectSingleNode IXMLDOMNode

4.7k views Asked by At

I've a XML file and read it with SelectSingleNode in IXMLDOMNode. (Delphi-XE3)

XMLResult : IXMLDOMNode;

XMLResult.xml is below

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

My question is, how I can read every single item in the loop?

redlineparagraph index = 0 operation index = 0

operation index = 1

operation value = 'insert'

redlinephraselist index = 0

sourceparaid index = 0

redlineparagraph index = 1

operation index = 0

operation index = 1

operation value = 'insert'

redlinephraselist index = 0

sourceparaid index = 0

.......

Thanks...

1

There are 1 answers

1
TLama On BEST ANSWER

Your example listing doesn't make much sense to me, but it might be this way:

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;

I got this result from your XML file using the above code:

enter image description here