删除没有孩子的第一个命名节点
Remove first named node without childs
我有这个 xml 文件:
<a>
<Directory name="dir1">
<b>test1</b>
<Directory name="dir2">
<c>test2</c>
</Directory>
</Directory>
</a>
我将删除名称为 "dir1" 且没有子项的目录。
我想要这个:
<a>
<b>test1</b>
<Directory name="dir2">
<c>test2</c>
</Directory>
</a>
精确 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="APP">
<Directory Id="dirA4F7A43D3DBF467AC127F1422D00240E" Name="folder">
<Component Id="cmpCCEB1A915DCA242C688E53A21CE3C3CD" Guid="">
<File Id="fil0507E8B9603778F116316274B82F92D9" KeyPath="yes" Source="C:\Documents and Settings\folder\toto.xls" />
</Component>
<Component Id="54" Guid="">
<File Id="fil1E594FEBC557E93E0B15FC1DC3DE315F" KeyPath="yes" Source="C:\Documents and Settings\folder\APP.CFG" />
</Component>
......
...
</Directory>
</DirectoryRef>
</Fragment>
</Wix>
我阅读了其他 Whosebug 主题,但它不起作用或没有命名 XElement。
我会使用 Linq-to-Xml。
我只是尝试了这个 solution 来尝试删除第一个目录,但它不起作用(x 为空):
XNamespace ns = "http://schemas.microsoft.com/wix/2006/wi";
var x = doc.Root.Element(ns + "Directory");
x.Remove();
doc.Root.Add(x.Elements());
你有解决办法吗?
您要查找的元素不是根元素的子元素,而是后代元素,所以更改
XNamespace ns = "http://schemas.microsoft.com/wix/2006/wi";
var x = doc.Root.Element(ns + "Directory");
x.Remove();
doc.Root.Add(x.Elements());
至
XNamespace ns = "http://schemas.microsoft.com/wix/2006/wi";
XElement directory = doc.Descendants(ns + "Directory").First();
XElement parent = directory.Parent;
directory.Remove();
parent.Add(directory.Elements());
或属性值:
XElement directory = doc.Descendants(ns + "Directory").First(x => x.Attribute("Name").Value == "value");
我有这个 xml 文件:
<a>
<Directory name="dir1">
<b>test1</b>
<Directory name="dir2">
<c>test2</c>
</Directory>
</Directory>
</a>
我将删除名称为 "dir1" 且没有子项的目录。 我想要这个:
<a>
<b>test1</b>
<Directory name="dir2">
<c>test2</c>
</Directory>
</a>
精确 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="APP">
<Directory Id="dirA4F7A43D3DBF467AC127F1422D00240E" Name="folder">
<Component Id="cmpCCEB1A915DCA242C688E53A21CE3C3CD" Guid="">
<File Id="fil0507E8B9603778F116316274B82F92D9" KeyPath="yes" Source="C:\Documents and Settings\folder\toto.xls" />
</Component>
<Component Id="54" Guid="">
<File Id="fil1E594FEBC557E93E0B15FC1DC3DE315F" KeyPath="yes" Source="C:\Documents and Settings\folder\APP.CFG" />
</Component>
......
...
</Directory>
</DirectoryRef>
</Fragment>
</Wix>
我阅读了其他 Whosebug 主题,但它不起作用或没有命名 XElement。 我会使用 Linq-to-Xml。 我只是尝试了这个 solution 来尝试删除第一个目录,但它不起作用(x 为空):
XNamespace ns = "http://schemas.microsoft.com/wix/2006/wi";
var x = doc.Root.Element(ns + "Directory");
x.Remove();
doc.Root.Add(x.Elements());
你有解决办法吗?
您要查找的元素不是根元素的子元素,而是后代元素,所以更改
XNamespace ns = "http://schemas.microsoft.com/wix/2006/wi";
var x = doc.Root.Element(ns + "Directory");
x.Remove();
doc.Root.Add(x.Elements());
至
XNamespace ns = "http://schemas.microsoft.com/wix/2006/wi";
XElement directory = doc.Descendants(ns + "Directory").First();
XElement parent = directory.Parent;
directory.Remove();
parent.Add(directory.Elements());
或属性值:
XElement directory = doc.Descendants(ns + "Directory").First(x => x.Attribute("Name").Value == "value");