使用XElement的XML的结构如下所示。我在XDocument中使用XElement
<?xml version='1.0' encoding='UTF-8'?>
<return xmlns:rmas="" xmlns:xsi="" xsi:noNamespaceSchemaLocation="">
<header>
[...]
</header>
<body>
<scheme>
[...]
<data>
<serial-no>1</serial-no>
<employment>1</employment>
<code>1234</code>
</data>
<data />
<data />
</scheme>
<scheme>
[...]
<data>
<serial-no>1</serial-no>
<employment>1</employment>
<code>1234</code>
</data>
<data />
<data />
</scheme>
<scheme>
[...]
<data>
<serial-no>1</serial-no>
<employment>1</employment>
<code>1234</code>
</data>
<data />
<data />
</scheme>
</body>
</return>
我想删除没有子元素(即
<data />
元素)的所有数据元素。这是我的代码
foreach (XElement scheme in doc.Descendants("scheme"))
{
//copy an existing node as template for new data node.
XElement newData = XElement.Parse(scheme.Element("data").ToString());
newData.Element("serial-no").SetValue("abc1234");
newData.Element("employment").SetValue("PUZAD-452");
newData.Element("code").SetValue(codeValue);
XElement newData2 = XElement.Parse(scheme.Element("data").ToString());
newData2.Element("serial-no").SetValue("abc1234");
newData2.Element("employment").SetValue("PUZAD-452");
newData2.Element("code").SetValue(codeValue);
XElement newData3 = XElement.Parse(scheme.Element("data").ToString());
newData3.Element("serial-no").SetValue("abc1234");
newData3.Element("employment").SetValue("PUZAD-452");
newData3.Element("code").SetValue(codeValue);
if (getGlobalScheme1 == "1111")
{
if ((string)(scheme.Descendants("code").First()) == "1111")
{
newData2.RemoveAll();
newData3.RemoveAll();
}
scheme.Add(newData);
}
if (getGlobalScheme2 == "2222")
{
if ((string)(scheme.Descendants("code").First()) == "2222")
{
newData.RemoveAll();
newData3.RemoveAll();
}
scheme.Add(newData2);
}
if (getGlobalScheme3 == "3333")
{
if ((string)(scheme.Descendants("code").Last()) == "3333")
{
newData.RemoveAll();
newData2.RemoveAll();
}
scheme.Add(newData3);
}
}
如何实现我的目标,即删除没有子元素的
<data />
元素。我一直在努力解决这个问题,但无济于事。
答案 0 :(得分:0)
我会尽力回答。
尝试将具有子元素的元素添加到数组中,然后对其进行迭代。
给出以下建议,在foreach
语句之前使用它:
var nodes = doc.Descendants("scheme").Where(x => x.Element("data") != null).ToList();
除此之外,您可以尝试使用完全相反的逻辑,方法是检查当前正在迭代的节点是否具有此代码段的子代:
YourXmlNode.ChildNodes.OfType<XmlElement>().Any()
我还添加了一些文章和答案的链接,我认为这些链接将帮助您找出问题所在。
答案 1 :(得分:0)
(1)让您将XML保存为文件系统上的文件。
(2)我们将创建一个 SCHEME 节点的wmic Path win32_process Where "CommandLine Like '%%\\explorer.exe %% -Embedding'" Call Terminate
列表。
(3)遍历 SCHEME 节点列表,并删除没有子元素的 DATA 元素。
(4)将修改后的XML保存回文件。
XML文件
List<XElement>
c#
<?xml version="1.0" encoding="UTF-8"?>
<return xmlns:rmas="someURI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="fafa.xsd">
<header>[...]</header>
<body>
<scheme>
<data>
<serial-no>1</serial-no>
<employment>1</employment>
<code>1234</code>
</data>
<data/>
<data/>
</scheme>
<scheme>
<data>
<serial-no>1</serial-no>
<employment>1</employment>
<code>1234</code>
</data>
<data/>
<data/>
</scheme>
<scheme>
<data>
<serial-no>1</serial-no>
<employment>1</employment>
<code>1234</code>
</data>
<data/>
<data/>
</scheme>
</body>
</return>
输出XML
void Main()
{
const string fileName = @"e:\Temp\Delete.xml";
const string SCHEME = "scheme";
const string DATA = "data";
XDocument xdoc = XDocument.Load(fileName);
// create list of SCHEME nodes
List<XElement> nodes = xdoc.Descendants(SCHEME).ToList();
// iterate through list of SCHEME nodes and delete DATA elements without children.
foreach (XElement node in nodes)
node.Elements(DATA).Where(n => n.DescendantNodes().Count() == 0).Remove();
// end result
Console.WriteLine(xdoc);
// save back
// xdoc.Save(fileName);
}