2013-09-03 2 views
1

У меня есть XML-файл и читайте его с помощью SelectSingleNode в IXMLDOMNode. (Delphi-XE3)SelectSingleNode IXMLDOMNode

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> 

Мой вопрос, как я могу читать каждый элемент в цикле?

redlineparagraph индекс = 0 операции значение индекса индекс = 0

операция = 1

операция = 'вставка'

индекс redlinephraselist = 0

sourceparaid индекс = 0

redlineparagraph index = 1

индекс

операции = 0

операции значение индекса = 1

операция = 'вставка'

индекс redlinephraselist = 0

sourceparaid индекс = 0

...... .

Спасибо ...

ответ

2

Ваш пример листинга не имеет большого смысла для меня, но это может быть так:

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, используя приведенный выше код:

enter image description here

+0

спасибо для вашего кода. Это дало мне много идей, и я узнал, как я могу использовать некоторые функции. –

+0

Добро пожаловать! – TLama

Смежные вопросы