在 C# 中实时编辑 xml.删除包含特定值的节点 [英] Editing xml on live in C#. Deleting nodes that contain specific value

查看:24
本文介绍了在 C# 中实时编辑 xml.删除包含特定值的节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样类型的 xml 文档:

I have an xml document of type like this:

<?xml version="1.0" encoding="UTF-16"?>
<Recordset>
  <Table>Recordset</Table>
  <Rows>
    <Row>
      <Fields>
        ...
        <Field>
          <Alias>StatusName</Alias>
          <Value>Scheduled</Value>
        </Field>
        <Field>
          <Alias>U_Revision</Alias>
          <Value>code00</Value>
        </Field>
        <Field>
          <Alias>U_Quantity</Alias>
          <Value>10.000000</Value>
        </Field>
        <Field>
          <Alias>U_ActualQty</Alias>
          <Value>0.000000</Value>
        </Field>
        ...
      </Fields>
    </Row>
    ...
    <Row>
      <Fields>
        ...
        <Field>
          <Alias>StatusName</Alias>
          <Value>Scheduled</Value>
        </Field>
        <Field>
          <Alias>U_Revision</Alias>
          <Value>code00</Value>
        </Field>
        <Field>
          <Alias>U_Quantity</Alias>
          <Value>150.000000</Value>
        </Field>
        <Field>
          <Alias>U_ActualQty</Alias>
          <Value>0.000000</Value>
        </Field>
        ...
      </Fields>
    </Row>
  </Rows>
</Recordset>

我在别名为 StatusName 的字段中有不同的值.有一些 Scheduled、notScheduled、Realeased、Finished 等值.我想要做的是删除包含别名为 StatusName 和值的节点的每个节点,例如 Scheduled 或 Finished.

I have different values in field with alias of StatusName. There are some Scheduled, notScheduled, Realeased, Finished etc values. What I would like to do is to delete each node that contain node with alias StatusName and value lets say Scheduled or Finished.

我本来想或多或少地这样做,但是我做错了.有人可以让我走正确的路吗?

I was thinking to do this more or less in that way however I am doing something wrong. May anybody let me on right way ?

            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.LoadXml(xml);
            XmlNodeList nodes = xmlDocument.SelectNodes("//Rows[@StatusName='Finished']");
            for (int i = nodes.Count - 1; i >= 0; i--)
            {
                nodes[i].ParentNode.RemoveChild(nodes[i]);
            }
            var newXml = nodes.ToString();

如果包含别名 StatusName 和特定值,我想删除整个节点,比如 Finished.

I would like to delete the whole node if contains with alias StatusName and specific value lets say Finished.

我希望结果是新的字符串变量.

I would expect the result in new string variable.

推荐答案

我喜欢用 xml 处理 DataTable,我发现它很容易.我使用 DataTable 来处理您的节点.所以,我拿了你的 xml 文件并为你写了一些可能对你有帮助的代码:

I like to work with DataTable with xml, I found it very easy. I used a DataTable to work with your nodes. So, I took your xml file and wrote some code for you that might help you:

//READ THE XML FILE
XmlDocument xmlDoc = new XmlDocument();
//My path
xmlDoc.LoadXml(Properties.Resources.test);

//Read the xml file into a dataSet
DataSet ds = new DataSet();
XmlNodeReader xnr = new XmlNodeReader(xmlDoc);
ds.ReadXml(xnr);

//Your data will be store in the 4's dataTable of the dataSet ( the <field> )
for(int i=0;i<ds.Tables[4].Rows.Count;i++)
{
    //Check the value as you wish
    //Here i want to suppress all the <Field> nodes with <Value> = "Scheduled"
    if ( ds.Tables[4].Rows[i]["Value"].ToString().Equals("Scheduled"))
    {
        //RemoteAt will remove all the node, so the node <Field> in your example data
        ds.Tables[4].Rows.RemoveAt(i);
        //If you want to only remove the node <Value>  (and not all the <Field> node ) just do ds.Tables[4].Rows["Value"]=null;
     }
}
//Write your new content in a new xml file

//As you wanted here you just read the new xml file created as a string
using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    ds.WriteXml(xmlTextWriter);
    xmlTextWriter.Flush();
    stringWriter.GetStringBuilder().ToString();
    //Here the result is in stringWriter,  and  there is 6 <Field> nodes, and not 8 like before the suppress
}

//If you want to create a new xml file with the new content just do 
ds.WriteXml(yourPathOfXmlFile);
//( like rewriting the previous xml file )

这篇关于在 C# 中实时编辑 xml.删除包含特定值的节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆