簡體   English   中英

如何從XML刪除空的XML子標記

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM