我希望删除特定标记下的空xml标记。
例如,我有这个XML:
<?xml version="1.0" encoding="UTF-16"?>
<apiRequest>
<policyTransaction>
<addDriver>
<driverName>xyz</driverName>
<IsCoInsured/>
<OnlyInsuredWithThisPolicy/>
</addDriver>
<retrieveDrivers/>
<validateDrivers/>
</policTransaction>
</apirequest>
我希望这是:
<?xml version="1.0" encoding="UTF-16"?>
<apiRequest>
<policyTransaction>
<addDriver>
<driverName>xyz</driverName>
</addDriver>
<retrieveDrivers/>
<validateDrivers/>
</policTransaction>
</apirequest>
我正在使用以下代码执行此操作
var doc= XDocument.Parse(requestString);
var emptyElements = from descendant in doc.Descendants()
where descendant.IsEmpty || string.IsNullOrWhiteSpace(descendant.Value)
select descendant;
emptyElements.Remove();
但adddriver之后的元素也被淘汰了。
<?xml version="1.0" encoding="UTF-16"?>
<apiRequest>
<policyTransaction>
<addDriver>
<driverName>xyz</driverName>
</addDriver>
</policTransaction>
</apirequest>
我不想发生这种事。如果子元素为空,我怎么才能检查要删除的子元素?我希望元素retrieveDrivers和validateDrivers存在。
以上是通过请求获得的,所以一旦发送了这个XML,我就会得到回复,并填充这两个标签的元素。
答案 0 :(得分:1)
您只想从特定元素中删除空元素,而不是一般的文档,因此不是
doc.Decendants()
使用
doc.Descendants("addDriver").Elements() // all sub elements of elements called addDriver
这是最简单的解决方案。这不会删除只有空元素的元素。
但要小心,如果声明了名称空间,则必须使用正确的XName而不是普通字符串。有关详细信息,请参阅this。
这是一种更通用的方法 使用系统; 使用System.Linq; 使用System.Xml.Linq;
命名空间Sandbox { 公共课程 {
public static void Main(string[] args)
{
string xml = @"<?xml version='1.0' encoding='UTF-16'?>
<apiRequest>
<policyTransaction>
<addDriver>
<driverName>xyz</driverName>
<IsCoInsured/>
<OnlyInsuredWithThisPolicy/>
</addDriver>
<retrieveDrivers/>
<validateDrivers/>
</policyTransaction>
</apiRequest>";
XDocument doc = XDocument.Parse(xml);
doc.Root.RemoveEmptyChildren("addDriver");
Console.WriteLine(doc);
Console.ReadKey();
}
}
public static class XElementExtension
{
public static void RemoveEmptyChildren(this XElement element, XName name = null, bool recursive = false)
{
var children = name != null ? element.Descendants(name) : element.Descendants();
foreach (var child in children.SelectMany(child => child.Elements()).ToArray())
{
if (child.IsEmpty || string.IsNullOrWhiteSpace(child.Value))
child.Remove();
}
}
}
}
答案 1 :(得分:0)
工作正常如果我以这种方式使用它。
var requestString = XmlSerializer.Serialize(request);
var requestStringWithoutNullElements = XDocument.Parse(requestString);
var emptyElements = from descendant in requestStringWithoutNullElements.Descendants()
where descendant.IsEmpty && descendant.Name != "retrieveDrivers" && descendant.Name != "validateDrivers"
select descendant;
emptyElements.Remove();