- <xmlpackage>
- <lesson1 lesson1="sdfgh">
  <a a="1" /> 
  <b b="2" /> 
  <c c="3" /> 
  <d d="4" /> 
  </lesson1>
  </xmlpackage>
XML格式如上。 怎么添加新的lesson呢?我用insert总报错呢。

解决方案 »

  1.   

    insert报什么错?insert的代码贴出来看看
      

  2.   

    不用贴,只要能添加新的lesson的代码就可以了,另外求xml中insert的用法实例。
      

  3.   


    var
       node : ixmlNode; 
    begin
      node := xml.DocumentElement;
       xml.DocumentElement := Node;
       Node := Node.AddChild('lesson');
      

  4.   

    添加完成,insert的用法谁能告诉下?
      

  5.   

    我一般都是这样
    uses msxml;procedure TForm1.FormCreate(Sender: TObject);
    var
      xml: IXMLDOMDocument;
      xmlNode, childNode: IXMLDOMNode;
      xmlElement: IXMLDOMElement;
    begin
      xml := CoDOMDocument.Create;
      xml.load('c:\1.xml');
      xmlNode := xml.selectSingleNode('/xmlpackage');
      //添加lession2
      ChildNode := xmlnode.appendChild(xml.createElement('lession2'));
      xmlelement := ChildNode as IXMLDOMElement;
      xmlelement.setAttribute('lession2', 'asdfadfasf');
      //添加lession2子结点
      xmlNode := childNode;  ChildNode := xmlnode.appendChild(xml.createElement('a'));
      xmlelement := ChildNode as IXMLDOMElement;
      xmlelement.setAttribute('a', '1');  ChildNode := xmlnode.appendChild(xml.createElement('b'));
      xmlelement := ChildNode as IXMLDOMElement;
      xmlelement.setAttribute('b', '2');  ChildNode := xmlnode.appendChild(xml.createElement('c'));
      xmlelement := ChildNode as IXMLDOMElement;
      xmlelement.setAttribute('c', '3');  ChildNode := xmlnode.appendChild(xml.createElement('d'));
      xmlelement := ChildNode as IXMLDOMElement;
      xmlelement.setAttribute('d', '4');  xml.save('c:\1.xml');
    end;
      

  6.   

    為什麼一定要用INSERT呢?:)
      

  7.   

    供参考:procedure TXMLOption.AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string);
    var
      Internal: IXMLDOMElement;
    begin
      Internal:=IXMLDOMElement(Parent.AppendChild(FXMLDoc.CreateElement(Field)));
      Internal.AppendChild(FXMLDoc.CreateTextNode(Value));
    end;
    //填加一个节点到后面
    procedure TXMLOption.AppendProtocol(newptl: RecProtocol);
    var
      xnode:IXMLDOMElement;
      xroot:IXMLDOMElement;
    begin
      if FActive then
      begin
        xroot:=FXMLDoc.documentElement;
        xnode :=IXMLDOMElement(xroot.AppendChild(FXMLDoc.CreateElement(ItemTag)));
        xnode.setAttribute(XML_TypeId, newptl.P_TypeId);
        AddSimpleElement(xnode, XML_Id, newptl.P_Id);
        AddSimpleElement(xnode, XML_Name, newptl.P_Name);
        AddSimpleElement(xnode, XML_CtrlCode, newptl.P_CtrlCode);
        AddSimpleElement(xnode, XML_FunCode, newptl.P_FunCode);
        AddSimpleElement(xnode, XML_DataLength, newptl.P_DataLength);
        AddSimpleElement(xnode, XML_DataFormat, newptl.P_DataFormat);
        AddSimpleElement(xnode, XML_Unit, newptl.P_Unit);
        AddSimpleElement(xnode, XML_InitValue, newptl.P_InitValue);
        AddSimpleElement(xnode, XML_RwFlag, newptl.P_RwFlag);
        AddSimpleElement(xnode, XML_LPwd, newptl.P_LPwd);
        AddSimpleElement(xnode, XML_HPwd, newptl.P_HPwd);
        AddSimpleElement(xnode, XML_Help, newptl.P_Help);
        FXMLDoc.save(FFilename);
      end;
    end;
      

  8.   

    var
       node,tempNode : ixmlNode; 
       XML:TXMLDocument;
    begin
      XML:=TXMLDocument.Create(self); 
     try
      XML.LoadFromFile('');
      node := XML.DocumentElement.ChildNodes.FindNode(xmlpackage);
      if node <> nil then
      begin
        tempNode  := Node.AddChild(lesson);
        tempNode.Attributes('lesson1') := 'sdfgh';
      end;
     finally
       XML.Free ;
     end;
    end;
      

  9.   

    貌似xml是没有直接insert的吧。但是它的属性跟Tstringlist是相似的。。可以借鉴一下
      

  10.   

    还是这样?Node.AttributeNodes.Insert();
      

  11.   

    我看了insert的用法(index:integer,const node:IXMLNODE);
    就是没会用,呵呵,知道的告诉下吧,谢谢大家的帮忙!
      

  12.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      Node,RootNode:IXMLNode;
      NewNode:IXMLNode;
    begin
      XMLDocument.Active:=True;
      RootNode:=XMLDocument.CreateNode('xmlpackage');
      XMLDocument.DocumentElement:=RootNode;
      Node:=XMLDocument.CreateNode('lesson1');
      XMLDocument.DocumentElement.ChildNodes.Add(Node);
      Node.ChildNodes.Add(XMLDocument.CreateNode('Hello....',ntText));
      Node.AttributeNodes.Add(XMLDocument.CreateNode('length',ntAttribute));
      Node.SetAttribute('length','16');  NewNode:=XMLDocument.CreateNode('lesson2');
      XMLDocument.DocumentElement.ChildNodes.Insert(1,NewNode);
      NewNode.ChildNodes.Add(XMLDocument.CreateNode('Hello....hhhhhhh',ntText));
      XMLDocument.SaveToFile('C:\test.xml');
    end;
      

  13.   

    XMLDocument.DocumentElement.ChildNodes.Insert(1,NewNode);
    1--代表第2个节点位置添加。。
    不知道楼主是不是要这样的效果???
      

  14.   


    uses msxml;
    ..........
    var
      xml: IXMLDOMDocument;
      nLesson1Element,nLesson2Element: IXMLDOMElement;
    begin
      xml := CoDOMDocument.Create;
      xml.loadXML('<xmlpackage>' +
        '<lesson1 lesson1="sdfgh">' +
        '  <a a="1" />' +
        '  <b b="2" />' +
        '  <c c="3" />' +
        '  <d d="4" />' +
        '</lesson1>' +
        '</xmlpackage>');
       nLesson1Element:=xml.selectSingleNode('/xmlpackage/lesson1')as IXMLDOMElement;
       nLesson2Element:=xml.createElement('lesson2');
       nLesson2Element.setAttribute('lession2','abcd');
       xml.documentElement.insertBefore(nLesson2Element,nLesson1Element);
       ShowMessage(xml.xml);
       xml := nil;
    end;
      

  15.   

    因为TXMLDocument对msxml的封装把最灵活的xpath丢了.