这是一个给cmdname标记对自动添加xref链接的代码,代码如下: var 
  xml: IXMLDOMDocument; 
  node: IXMLDOMNode; 
  nodelist: IXMLDOMNodeList; 
  i: integer; 
begin 
  xml :=  CreateOleObject('MSXML2.DOMDocument') as IXMLDOMDocument; 
  xml.Async := False; 
  xml.ValidateOnParse := False; 
  xml.ResolveExternals := False; 
  xml.PreserveWhiteSpace := True;   xml.load(FilenameEdit1.FileName);          //读文件 
  
  nodelist := xml1.selectNodes('//cmdname');  //找所有的cmdname元素 
  
  if nodelist = nil then exit;                //没有cmdname元素就结束   for i := 0 to nodelist.length - 1 do        //依次处理cmdname元素 
  begin 
    node := nodelist.item[i];                //当前的cmdname元素 
   if node.selectNodes('ancestor::xref') <> nil then continue;  //想要选择当前cmdname元素的所有xref父辈节点,如果有,那么就不用再添加了。     
    //后面的代码不用管了,就是给cmdname元素添加链接的代码。 
  end; 
end;红色代码执行不过去,不知道这里用Axes为啥不行,应该写成啥样?在线等待!!! 
错误如下: 
Project xxxx.exe raised exception clase EOleException with message '预期的句柄'eof'找到':'。 
ancestor-->: <--:xref'. Process stopped. Use Step or Run to continue. 

解决方案 »

  1.   

    http://byteh.blog.163.com/blog/static/495259920079831923661/////////////////////////////////////////////////////////////////////////
    创建IXMLDOMDocument对象的三种方法:
    (1)[方法1] 直接创建 IXMLDOMDocument  , 例(1)
       uses msxml; 
       var DOC:IXMLDOMDocument;
       doc := CoDOMDocument.create;
       .....
       Doc := nil;
     A)doc.load('C:\temp.xml');  //从文件载入
     B) 动态创建
       var aElement,aElement2: IXMLDOMElement;  // [ aNode:IXMLDOMNode ==>  .AppendChild() ]   //加入版本信息 ‘<?xml version="1.0" ?> ’
       doc.AppendChild(doc.CreateProcessingInstruction('xml', 'version="1.0" encoding="GB2312"')); 
         (*)因为此函数返回结果不包含 'encoding="GB2312"' 故须保存前注意.
       //加入根结点
       doc.AppendChild(doc.CreateElement('bootDocNode')); //// == aElement  
       //加入子结点
       aElement:=IXMLDOMElement(Doc.DocumentElement.AppendChild(Doc.CreateElement('ChileNode1')));
       //设置接点属性
       aElement.SetAttribute('ID', '11');
       aElement.SetAttribute('Units', '元/m2');
       //设置结点内容
       aElement.AppendChild(Doc.CreateTextNode('结点内容'));
       //子结点添加子结点
       aElement2:=IXMLDOMElement(aElement.AppendChild(Doc.CreateElement('Child_ChileNode1')));(2) [方法2] 直接创建 IXMLDocument ( 不是IXMLDOMDocument )
      uses XMLIntf,XMLDoc;
      var xmlDoc:IXMLDocument; aNode:IXMLNode;  s:string;   xmlDoc := TXMLDocument.Create(nil);
      try
        //加入版本信息 ‘<?xml version="1.0" encoding="GB2312" ?> ’
        xmlDoc.Active := True;   xmlDoc.Version := '1.0';  xmlDoc.Encoding :='GB2312'; 
        //加入根结点
        aNode:=xmlDoc.AddChild('bootDocNode');
        //加入子结点
        aNode:=aNode.AddChild('ChileNode1');
        //设置接点属性
        aNode.SetAttribute('ID', '22');
        aNode.SetAttribute('Units', '元/m2');
        //设置结点内容
        aNode.Text := '结点内容';
        //子结点添加子结点
        aNode:=aNode.AddChild('Child_ChileNode1') ;
        aNode.Text := 'Child_ChileNod内容';
       
        s := xmlDoc.XML.Text ;  //  .XML 返回的是 Tstrings
      finally
        xmlDoc := nil ;
      end;(3)利用 XMLDataBinding
        I) 准备好XML文件,此XML文件有较强的代表性,保证程序中所用的结点及其关系都存在
       II)利用 file-->new-->XML Data Binding
      III)创建XML对象
       A)v:string; //XML文件内容
        Doc : IXMLBudgetDocTyp; //IXMLBudgetDocTyp是XML文件的根结点
        Doc := LoadXMLData(v).GetDocBinding('BudgetDoc', TXMLBudgetDocType) as IXMLBudgetDocType;
       B)Doc := LoadBudgetDoc('C:\temp.xml');
      IV) 应用
        Doc.ChildNodes.FindNode('Docfile') as IXMLDocfileType;(4)利用TXMLDocument控件
        XMLDocument1.fileName:='C:\temp.xml';
        XMLDocument1.active:=true;  // XMLDocument1 相当于 Doc(5)XML对象的其他方法
       IXMLNodeList.FindNode(NodeName: DOMString): IXMLNode;
       IXMLNodeList.FindNode(NodeName, NamespaceURI: DOMString): IXMLNode;
       IXMLNodeList.FindNode(ChildNodeType: TGuid): IXMLNode; 
       IXMLNodeList.FindSibling(const Node: IXMLNode; Delta: Integer): IXMLNode;
       IXMLNodeList.First: IXMLNode;
       IXMLNodeList.Last: IXMLNode;
       ... ...
        
    ////////////////////////////////////////////////////////////////////////
    //例(1)
    uses msxml;   
        doc:IXMLDOMDocument;
        budgetdoc:ixmlDomNode;
        Rela:IxmlDOMNode;
        rs:ixmldomnodelist;//建立或取得XML结点
      doc := CoDOMDocument.create;
      doc.load('C:\temp.xml');
      budgetDoc := doc.selectSingleNode('BudgetDoc');
      rela := budgetdoc.SelectSingleNode('Relation'); //创建XML子结点  
      if not assigned(rela) then
      begin
        rela :=  doc.createElement('Relation');
        rela.setAttribute('BudgetId',0);
        rela.setAttribute('name','名称');
        budgetdoc.appendChild(rela); 
      end;//取子结点(序列)
      rs := rela.selectNodes('Rela[@BudgetId="2" and @TaskId="8"]');
      for i := 0 to rs.length -1 do
      begin
        s:= s + rs[i].attributes.getnameditem('NewRate').nodeValue;
      end;
      
      rela:=doc.ChildNodes.FindNode('DOMNode') as IxmlDOMNode;//移除子结点
        for i := rs.length -1 downto 1 do
          rela.removeChild(rs[i])//取父结点
        if assigned(anode.parentNode) and (Anode.parentNode.nodeName='Task') then
          result := Anode.parentNode;//取属性
      DOC.DocumentElement.Attributes['Name']
      rela.Attributes['Name']
      rs.Nodes[i].Attributes['Name']  Ajob:ixmldomnode;jobs:ixmldomNodeList;
      jobs := Ajob.selectNodes('RCJ[@Attrib="'+AAttrib+'"]')