如何使用C#从xml文件中删除所有空元素?
如何使用C#从XML文件中删除所有空元素 例如: 输入如何使用C#从xml文件中删除所有空元素?,c#,xml,C#,Xml,如何使用C#从XML文件中删除所有空元素 例如: 输入 某个名字 某条街 某市 某个名字 输出 <Person> <PersonDetails> <Name>Some Name</Name> <Address> <Street>Some Street</Street> <City>Some City</City> </Addre
某个名字
某条街
某市
某个名字
输出
<Person>
<PersonDetails>
<Name>Some Name</Name>
<Address>
<Street>Some Street</Street>
<City>Some City</City>
</Address>
</PersonDetails>
<PersonDetails>
<Name>Some Name</Name>
</PersonDetails>
</Person>
某个名字
某条街
某市
某个名字
根据您更新的问题,您只需使用XPath one liner即可获得所需内容:
var doc = XElement.Parse(source); // or XElement.Load(filename) if coming from a file
doc.XPathSelectElements("//*[string-length() = 0]").ToList().Remove();
doc.Save(filename) // or doc.ToString() if you want the string output
如果不想使用XPath,可以使用子体()
和LINQ:
doc.Descendants().ToList().Where(d => d.Value.Length == 0).Remove();
在这两种情况下,都需要使用
ToList()
,以确保您没有修改现有的可枚举项。根据您更新的问题,您只需使用XPath one liner即可获得所需内容:
var doc = XElement.Parse(source); // or XElement.Load(filename) if coming from a file
doc.XPathSelectElements("//*[string-length() = 0]").ToList().Remove();
doc.Save(filename) // or doc.ToString() if you want the string output
如果不想使用XPath,可以使用子体()
和LINQ:
doc.Descendants().ToList().Where(d => d.Value.Length == 0).Remove();
这两种情况下都需要使用
ToList()
,以确保您没有修改可枚举项。欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击“代码示例”按钮({}
)在编辑器工具栏上很好地格式化和语法突出显示它!不需要“破坏”您的XML,也不需要大量的
标记-只需格式化它@马克:酷,我从没注意到。我总是额外键入四个空格,或者在发布之前在VS2010中缩进我的代码。是否要从内到外递归删除空元素?例如,如果Persondeail中的所有元素都为空,是否还要删除Persondeail元素?欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击“代码示例”按钮({}
)在编辑器工具栏上很好地格式化和语法突出显示它!不需要“破坏”您的XML,也不需要大量的
标记-只需格式化它@马克:酷,我从没注意到。我总是额外键入四个空格,或者在发布之前在VS2010中缩进我的代码。是否要从内到外递归删除空元素?例如,如果PersonDetail中的所有元素都为空,是否还要删除PersonDetail元素?谢谢,这一个很有效。但它不会删除元素(层次结构)中的空元素。在我的案例中,我将获得具有不同结构的不同xml文件。对于任何类型的XML结构,是否有任何方法可以从中删除空元素?您可以通过创建一个方法(例如IsElementEmpty())来非常轻松地调整这个答案,该方法递归所有子元素,直到它为1。子元素或2已用完。找到一个值为的。@user1432798我已经更新了答案,可以满足您的要求。谢谢,这个很有用。但它不会删除元素(层次结构)中的空元素。在我的案例中,我将获得具有不同结构的不同xml文件。对于任何类型的XML结构,是否有任何方法可以从中删除空元素?您可以通过创建一个方法(例如IsElementEmpty())来非常轻松地调整这个答案,该方法递归所有子元素,直到它为1。子元素或2已用完。找到一个值为的。@user1432798我已经更新了答案,可以满足您的要求。