【问题标题】:Remove a attribute from the IXMLDOMDocument2 (Delphi)从 IXMLDOMDocument2 (Delphi) 中删除一个属性
【发布时间】:2013-12-16 03:21:47
【问题描述】:

我有以下 XML:

<TABLE Table="STUDENT">
    <FIELD fieldName="ID" fldType="INT"/>
    <FIELD fieldName="NAME" fldType="STRING"/>
    <FIELD fieldName="REDUNDANTFIELD" fldType="STRING"/>
    <FIELD fieldName="PHONENUMBER" fldType="STRING"/>
</TABLE>

我想删除字段名属性为“REDUNDANTFIELD”的行。我该怎么做?

删除行后的预期输出

<TABLE Table="STUDENT">
    <FIELD fieldName="ID" fldType="INT"/>
    <FIELD fieldName="NAME" fldType="STRING"/>
    <FIELD fieldName="PHONENUMBER" fldType="STRING"/>
</TABLE>

谁能帮我继续以下功能?

function RemoveAttributeRRow(myXML: IXMLDOMDocument2): IXMLDOMDocument2;
begin
  // my code here
  Result:= ???;
end;

【问题讨论】:

    标签: xml delphi delphi-7


    【解决方案1】:
    procedure RemoveAttributeRRow(doc: IXMLDOMDocument2);
    var
      node: IXMLDOMNode;
    begin
      node := Doc.selectSingleNode('//FIELD[@fieldName=''REDUNDANTFIELD'']');
      if node<>nil then
        node.parentNode.removeChild(node);
    end;
    
    procedure TForm14.Button3Click(Sender: TObject);
    var
      m: IXMLDOMDocument2;
    begin
      m := CoDOMDocument.Create;
      m.load('c:\work\1.xml');
      RemoveAttributeRRow(m);
      m.save('c:\work\2.xml');
    end;
    

    【讨论】:

    • 我有 2 个 cmets:(1) Id 在RemoveAttributeRRow(doc: IXMLDOMDocument2; fieldName: string) 中创建另一个参数以更通用。 (2) 更改 if node=nil then exit; -> if Assigned(node) then node.parentNode.removeChild(node);.
    • @kobik:这似乎很明显,任何人都可以根据自己的需要进行调整(为节点名称、属性名称、属性值创建参数...)。这里唯一不是 100% 明显的是 XPath 表达式的语法。所以我认为任何添加都不会帮助任何人,但会使 XPath 更难阅读/理解。
    • @user:如果建议的答案是解决方案,那么您应该接受它(点击柜台下的标记)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2021-01-16
    相关资源
    最近更新 更多