向XML添加新元素

时间:2017-05-17 16:13:33

标签: xml delphi

这是我的Xml

<Cars>
<Car id="1" name="Opel" picture="\File\JPEG\opel.jpg" />
<Car id="2" name="Ford" picture="\File\JPEG\ford.jpg"  />
<Car id="3" name="Volvo" picture="\File\JPEG\volvo.jpg" />
</Cars>

现在我想添加新车

Listbox1     Listbox2 
(CarName)   (Car.Picture)
 BMW        \File\JPEG\bmw.jpg
Mercedes    \File\JPEG\Merdedes.jpg

我有车的问题。爱。每个ID必须唯一(+1) 文件中已有3辆汽车如何让其他车辆成为+1

我的代码

    var
    lNewCar: IXMLCarType;
      i, NewID : Integer;
      begin
      i:= 0;
      NewID := 1 + MaxID (Form1.Memo1.Lines.Text);
      while ( i < ListBox1.Count) and  ( i < ListBox2.Count) 
      begin
        lNewCar := XMLIntf.Cars.add;
        lNewCar.id   := NewID;
        lNewCar.name := Listbox1.Items[i];
        lNewCar.jpeg := Listbox2.Items[i];
       Inc(i);
      end;
    end;

1 个答案:

答案 0 :(得分:2)

鉴于XML的简单结构,只有Car根节点下面的一系列Cars节点,您可以通过迭代{{}找到最大的现有id属性值{1}}节点并检查其Car属性,如下所示:

示例项目:

id

您需要将XML文档作为字符串传递给此type TForm1 = class(TForm) Memo1: TMemo; btnMaxId: TButton; procedure btnMaxIdClick(Sender: TObject); procedure FormCreate(Sender: TObject); public end; function MaxId(const XML : String) : Integer; [...] var Form1: TForm1; implementation [...] procedure TForm1.btnMaxIdClick(Sender: TObject); begin ShowMessage(IntToStr(MaxID(Memo1.Lines.Text))); end; procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.Add('<Cars>'); Memo1.Lines.Add(' <Car id="1" name="Opel" picture="\File\JPEG\opel.jpg" />'); Memo1.Lines.Add(' <Car id="98" name="Ford" picture="\File\JPEG\ford.jpg" />'); Memo1.Lines.Add(' <Car id="3" name="Volvo" picture="\File\JPEG\volvo.jpg" />'); Memo1.Lines.Add('</Cars>'); end; function MaxId(const XML : String) : Integer; var XmlDoc: IXMLDOMDocument; NodeList : IXmlDOMNodeList; Node : IXMLDomNode; i : Integer; ID : Integer; ErrorCode : Integer; S : String; begin Result := 0; XmlDoc := CoDOMDocument.Create; try XmlDoc.Async := False; XmlDoc.LoadXml(XML); NodeList := XmlDoc.DocumentElement.childNodes; for i := 0 to NodeList.Length - 1 do begin Node := NodeList.item[i]; S := Node.attributes.GetNamedItem('id').nodeValue; Val(S, ID, ErrorCode); if ErrorCode = 0 then begin if ID > Result then Result := ID; end; end; finally XmlDoc := Nil; end; end; end. 函数。因此,如果q中的XML位于表单上的TMemo组件中,您可以像这样使用它:

MaxID

有一种更直接的方法来获取属性的最大值,例如, How to find the max attribute from an XML document using Xpath 1.0 但是这需要熟悉XPath查询,你需要注意它对于获取多字符var NewID : integer; begin NewID := 1 + MaxID (Form1.Memo1.Lines.Text); lNewExpression.id := NewID; 的最大值的说法。