如何从XML中删除空XML子标记

时间:2015-11-17 14:59:17

标签: c# 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,我就会得到回复,并填充这两个标签的元素。

2 个答案:

答案 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();