[英]How to remove empty XML child tags from an XML
我正在尋找刪除特定標記下的空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,我就獲得了響應,並填充了這兩個標簽的元素。
您只想從特定元素中刪除空元素,而不是通常從文檔中刪除,所以要代替
doc.Decendants()
采用
doc.Descendants("addDriver").Elements() // all sub elements of elements called addDriver
這是最簡單的解決方案。 這不會刪除只有空元素的元素。
但是請注意,如果聲明了名稱空間,則必須使用正確的XName而不是純字符串。 請參閱此以獲取更多信息。
這是使用System的更通用的方法; 使用System.Linq; 使用System.Xml.Linq;
命名空間沙箱{公共類程序{
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();
}
}
}
}
如果我以這種方式使用它,它工作正常。
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.