问答

c# – 删除没有子节点的父节点

 来源    2018-09-25    1  

我有一个与从xml文件中删除特定节点有关的问题.

这是我的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <nodeA attribute="1">
    <nodeB attribute="table">
      <nodeC attribute="500"></nodeC>
      <nodeC attribute="5"></nodeC>
    </nodeB>
    <nodeB attribute="3">
      <nodeC attribute="4"></nodeC>
      <nodeC attribute="5"></nodeC>
      <nodeC attribute="5"></nodeC>
    </nodeB>
    <nodeB attribute="placeHolder">
    <nodeB attribute="toRemove">
      <nodeB attribute="glass"></nodeB>
        <nodeE attribute="7"></nodeE>
      <nodeB attribute="glass"></nodeB>
      <nodeB attribute="glass"></nodeB>
    </nodeB>
    </nodeB>
    <nodeB attribute="3">
      <nodeC attribute="4"></nodeC>
      <nodeC attribute="5"></nodeC>
      <nodeC attribtue="5"></nodeC>
     </nodeB>
    <nodeB attribute="placeHolder">
    <nodeB attribute="toRemove">
      <nodeB attribute="glass"></nodeB>
        <nodeE attribute="7"></nodeE>
      <nodeB attribute="glass"></nodeB>
      <nodeB attribute="glass"></nodeB>
    </nodeB>
    </nodeB>
  </nodeA>
</root>

我想删除节点nodeB =“toRemove”而不删除此节点的子节点.之后我需要使用nodeB attribute =“placeHolder”做同样的事情.结果的一部分看起来像这样:

     <nodeB attribute="3">
      <nodeC attribute="4"></nodeC>
      <nodeC attribute="5"></nodeC>
      <nodeC attribtue="5"></nodeC>
     </nodeB>
     <nodeB attribute="glass"></nodeB>
        <nodeE attribute="7"></nodeE>
     <nodeB attribute="glass"></nodeB>
     <nodeB attribute="glass"></nodeB>

我一直在尝试这样的代码来实现:

        XmlNodeList nodeList = doc.SelectNodes("//nodeB[@attribute=\"toRemove\"]");

        foreach (XmlNode node in nodeList)
        {
            foreach (XmlNode child in node.ChildNodes)
            {
                node.ParentNode.AppendChild(child);
            }
            node.ParentNode.RemoveChild(node);
        }
        doc.Save(XmlFilePathSource);

我能够找到具有所需属性toRemove或placeHolder的节点,但是我无法将此节点的子节点向上移动一级.在这种情况下你能帮我吗?它可以是Linq,XDocument,XmlReader的解决方案,但我更喜欢使用XmlDocument.
感谢您提前给我提供的任何帮助.

编辑:

在这种情况下,我使用了稍微修改过的代码(以保持顺序),Chuck Savage写道.一旦删除

  <nodeB attribute="toRemove"> </nodeB>

然后再做同样的事情

  <nodeB attribute="placeHolder"></nodeB>

这是稍微修改过的代码

  XElement root = XElement.Load(XmlFilePathSource);
  var removes = root.XPathSelectElements("//nodeB[@attribute=\"toRemove\"]");
  foreach (XElement node in removes.ToArray())
  {
    node.Parent.AddAfterSelf(node.Elements());
    node.Remove();
  }
  root.Save(XmlFilePathSource);

@MiMo提供的xslt方法在这种情况下也非常有用.

使用Linq-to-XML和XPath,

XElement root = XElement.Load(XmlFilePathSource); // or .Parse(string)
var removes = root.XPathSelectElements("//nodeB[@attribute=\"toRemove\"]");
foreach (XElement node in removes.ToArray())
{
    node.AddBeforeSelf(node.Elements());
    node.Remove();
}
root.Save(XmlFilePathSource);

注意:System.Xml.XPath中提供了XPath

注意2:您可以使用these extensions转换为/从XmlDocument转换,因为您更喜欢XmlDocument.

MySQL:删除没有子节点的父记录
问答如何编写从父表中删除没有子项的记录的查询? 我有一个表简历和一个表personal_skill,它有一个resume_id字段来引用简历表.我需要删除恢复表中没有具有此类resume_id的perso ...
1
c# – 如何使用LINQ删除没有子节点的Xelement?
问答这是我的XML, <A> <B id="ABC"> <C name="A" /> <C name="B&qu ...
1
angularjs – 过滤嵌套的ng-repeat:隐藏没有子节点的父节点
问答我想从JSON文件中创建一些项目列表.数据结构(年,月,项目)如下所示: [{ "name": "2013", "months": [{ & ...
javascript – 如何删除自动生成id的父节点?如何指定id?
问答我在JavaScript中使用appendChild()创建了树状结构. 单击"添加"按钮时,将添加根节点.单击根节点时,将添加父节点.单击父节点时,将添加子节点. 现在我试图通过 ...
返回Java节点中的节点列表父节点可以有多个子节点
问答我正在尝试编写java代码以返回树中的节点列表. 树看起来像 节点类是 class Node{ String label; List<Node> children; } 我正在尝试这种方式 ...
xml – XSL – 如果节点具有给定节点作为父节点,则执行代码
问答我有以下XML(简化): <node1> <node2> <node3> </node3> </node2> </node1> ...
2
xml – xPath从子节点获取父节点
问答我需要获得父节点的子节点"标题50" 目前我只使用 //*[title="50"] 我如何获得其父? 结果应该是存储节点. <?xml version=& ...
1
c# – 如何确定所选节点是否是TreeView中的子节点或父节点?
问答如何查看所选节点是TreeView控件中的子节点还是父节点?::实际上如何实现这样的检查取决于你如何定义"子"和"父"节点.但是,每个TreeNode对象都有两 ...
1
xml – 如何检查当前节点的父节点是否是xslt中的根节点?
问答我想检查当前节点的父节点是否是Xslt中的根节点.我如何做? 请指导我离开这个问题- 谢谢&问候, P.SARAVANAN::你可以使用not(ancestor :: *). 用法示例: &l ...
1
user-interface – 用于显示子节点从父节点继承值的GUI模式
问答什么是良好的GUI模式,用于显示子项从其父项继承值.换句话说,如果用户在Parent中设置了一些值,我们如何在子节点中指示该值是从父级设置的? Parent | Value : Foo | |---- ...
1
python – 访问ElementTree节点的父节点
问答我使用内置的Python ElementTree模块.它是直接访问孩子,但父亲或兄弟节点怎么样? – 这可以有效地完成,而无需遍历整个树?::在父属性的形式中没有直接支持,但是您可以使用描述的here ...
1
MySQL嵌套集 – 如何查找节点的父节点?
问答我使用以下列运行了mill嵌套集层次结构类型设置: 表名: myset 列: id, name, lft, rgt 有没有人知道查询来确定节点的父节点? 我读了几个地方,在你的表中也有一个parent ...
1
hibernate – 如何使用分离的子节点保存父节点
问答我从UI发送一个对象.将使用对现有子项的引用来创建此对象. 这是这种关系的简单说明. class ParentEntity { @Id Long id; @ManyToOne(fetch = Fetc ...
1
如何从XSLT中的子节点读取父节点的属性
问答只是想知道如何从XSLT中的子节点读取父节点的属性. 码: <A> <b attr1="xx"> <c> </c> </b&g ...
1
XPath – 获取具有条件的文本节点的父节点
问答<doc ok="yes"> <a> <b> <c> aa <d ok="yes"> bb < ...
在WPF C#TreeView中获取子节点的父节点
问答我知道使用WPF在C#中编程与传统的C#程序不同,因此大多数在线资料都没有说明我需要的内容. 我的WPF窗口中有一个TreeView控件,我有父节点和子节点.我想将它们存储在Node类型的列表中(id ...
需要SQL查询才能查找没有子记录的父记录
问答我在SQL中并不熟悉,所以希望有人可以通过一个查询来帮助我,该查询将在父表中找到子表中没有记录的所有记录. 以下工作可以为我找到特定子字段值的父记录- `SELECT ParentTable.Pare ...
1
ruby-on-rails – 为什么ActiveRecord不够聪明,不知道父亲的object_id应该等于其子节点的父节点的object_id?
问答@father = Hierarchy.find(:first, :conditions => ['label = ?', 'father']) @father.children.each do ...
1
css – max-height:100%的父节点溢出父节点
问答我试图理解看起来是对我意想不到的行为: 我有一个max-height为100%的容器内的元素,也使用max-height,但是,意外的是,子元素溢出父: 测试用例:http://jsfiddle.ne ...
2