基于属性匹配从XmlDocument对象中删除节点和子节点

时间:2013-02-13 16:23:08

标签: c# linq c#-4.0

我有一个带有分层数据的xml文件我将它加载到XmlDocument对象中一直都很好,我现在要做的是删除所有节点和子节点,但属性为

的节点除外
  

AssetSysID = “6288”

我不确定如何实现这项任务,我们对任何帮助表示赞赏。将数据绑定到树视图的代码:

 XmlDataSource xDS = new XmlDataSource();
            XmlDocument xmlDoc = new XmlDocument();
xmlDoc = WTLIB.WTDAL.Legacy.DataTools.AssetList_XML(rcmbAssetType.SelectedValue);
                    if (xmlDoc != null)
                    {
                        #region Grid Filters
                if (Request.QueryString["grid"] == null)
                {
                    // Grid launched from Asset Screen
                    if (Request.QueryString["AssetSysID"] == null)
                        hdnGridAssetSysID.Value = "AssetSysID=" + "6288"; // Request.QueryString["AssetSysID"];
                    LoadGridData(xmlDoc);
                }

                #endregion

                xDS.Data = xmlDoc.InnerXml;
                xDS.XPath = "/xml/AMASM";
                xDS.EnableCaching = false;

                //  bind to treeview
                rtrvAMASM.Visible = true;
                rtrvAMASM.DataSource = xDS;
                rtrvAMASM.DataBind();
            }
            else
            {
                rtrvAMASM.Visible = false;
            }  
        }
        else
        {
            xDS = null;
            xmlDoc = null;
            rtrvAMASM.Visible = false;
        }

XML:

<xml>
  <AMASM AssetSysID="6288" Asset_ID="786387126" FROMLR="0.0000" Assets="786387126,(Facilities) , ( to ) Big tower-to-,Facilities">
    <AMACI ACISysID="10201" PAssetSysID="6288" Features="Sign, On the door" />
    <AMACI ACISysID="10115" PAssetSysID="6288" Features="Roof, Roof, NE corner" />
    <WMITM ITMSysID="5267" Equipment="220033,Truck #33">
      <AMSRQI SRQSysID="40" WorkOrders="E00006," />
      <AMSRQI SRQSysID="41" WorkOrders="E00007," />
      <AMSRQI SRQSysID="402" WorkOrders="E52,JDTest1" />
      <AMSRQI SRQSysID="603" WorkOrders="E0130,Wash" />
      <AMSRQI SRQSysID="656" WorkOrders="E0183,Program Error" />
      <AMSRQI SRQSysID="712" WorkOrders="E0239,Program Error" />
      <AMSRQI SRQSysID="986" WorkOrders="E0293,Testing Single Quote" />
      <AMSRQI SRQSysID="1534" WorkOrders="E0295," />
      <AMSRQI SRQSysID="1548" WorkOrders="E0296,Testing Extra fields" />
      <AMSRQI SRQSysID="1589" WorkOrders="E0299,Testing Extra fields" />
      <AMSRQI SRQSysID="1590" WorkOrders="30-2,Testing Extra fields" />
      <AMSRQI SRQSysID="2179" WorkOrders="PW12-00011,OilChange2" />
      <AMSRQI SRQSysID="2299" WorkOrders="30-3,Testing Extra fields" />
      <AMSRQI SRQSysID="2310" WorkOrders="30-4,Testing Extra fields" />
    </WMITM>
    <AMSRQI SRQSysID="1534" WorkOrders="E0295," />
    <AMSRQI SRQSysID="1548" WorkOrders="E0296,Testing Extra fields" />
    <AMSRQI SRQSysID="656" WorkOrders="E0183,Program Error" />
    <AMSRQI SRQSysID="712" WorkOrders="E0239,Program Error" />
    <AMSRQI SRQSysID="1589" WorkOrders="E0299,Testing Extra fields" />
    <AMSRQI SRQSysID="1590" WorkOrders="30-2,Testing Extra fields" />
    <AMSRQI SRQSysID="2165" WorkOrders="A00506,Test Inser" />
    <AMSRQI SRQSysID="2166" WorkOrders="A00507," />
    <AMSRQI SRQSysID="2167" WorkOrders="A00508,Test" />
    <AMSRQI SRQSysID="2299" WorkOrders="30-3,Testing Extra fields" />
    <AMSRQI SRQSysID="2310" WorkOrders="30-4,Testing Extra fields" />
    <AMFLI FLISysID="15" Floors="First Floor,Ground Level">
      <AMRMI RMISysID="21" Rooms="101,Admin Office">
        <AMSRQI SRQSysID="2165" WorkOrders="A00506,Test Inser" />
        <AMSRQI SRQSysID="2166" WorkOrders="A00507," />
        <AMSRQI SRQSysID="2167" WorkOrders="A00508,Test" />
      </AMRMI>
      <AMRMI RMISysID="22" Rooms="102,Security Office" />
      <AMRMI RMISysID="23" Rooms="103,Men's Washroom" />
      <AMRMI RMISysID="24" Rooms="104,Women's Washroom" />
    </AMFLI>
  </AMASM>
  <AMASM AssetSysID="6715" Asset_ID="HFBuild" FROMLR="0.0000" Assets="HFBuild,(Facilities) , High Falls Building,Facilities">
    <AMACI ACISysID="10132" PAssetSysID="6715" Features="" />
    <AMACI ACISysID="10133" PAssetSysID="6715" Features="" />
    <AMACI ACISysID="10134" PAssetSysID="6715" Features="" />
  </AMASM>
  <AMASM AssetSysID="6750" Asset_ID="F2000" FROMLR="0.0000" Assets="F2000,(Facilities) , Survey,Facilities" />
</xml>

3 个答案:

答案 0 :(得分:1)

使用此代码

  XDocument doc = XDocument.Load("input.xml");

doc.Root.Element("Applications").Elements("ApplicationName").Remove();

doc.Save("output.xml"); // or overwrite the input if wanted with doc.Save("input.xml");

答案 1 :(得分:1)

this post

的帮助下解决了这个问题
 int intLoop = 0;
                    XmlNodeList Nodes = xmlDoc.GetElementsByTagName("AMASM");            
                    //  Loop through the list
                    while (Nodes.Count != 0)
                    {
                        foreach (XmlNode Node in Nodes)
                        {
                            if ( ! ( (Node.Attributes["AssetSysID"].Value) == hdnGridAssetSysID.Value) )
                            {
                                Node.ParentNode.RemoveChild(Node); //   <--This line messes with our iteration and forces us to get a new list after each remove    
                                //  Stop the loop
                                break;
                            }                   
                        }
                        //  Get a refreshed list of offending nodes                
                        Nodes = xmlDoc.GetElementsByTagName("AMASM");
                        intLoop++;
                        if (intLoop > 5000) break;   // <-reason for that code is to break the loop out of infinity
                    }
                    Nodes = null;
                    intLoop = 0;  

答案 2 :(得分:0)

如果没有看到您的xml,我会执行以下操作:

XDocument.Load("input.xml").Descendants().Where(x => x.Attributes().Any(z => z.Name == "AssetSysID" && z.Value == "6288") == false);
相关问题