C# - 如何从 XElement 中删除 xmlns
C# - How to remove xmlns from XElement
如何从 XElement 中删除 xmlns
命名空间?
我试过:attributes.remove
,xElement.Name.NameSpace.Remove(0)
,等等,等等,都没有成功。
我的xml:
<event xmlns="http://www.blablabla.com/bla" version="1.00">
<retEvent version="1.00">
</retEvent>
</event>
我怎样才能做到这一点?
您可以使用 IsNamespaceDeclaration 来检测哪个属性是命名空间
xelement.Attributes()
.Where( e => e.IsNamespaceDeclaration)
.Remove();
@octaviocc 的回答对我不起作用,因为 xelement.Attributes()
是空的,它没有将命名空间作为属性返回。
以下内容将删除您案例中的声明:
element.Name = element.Name.LocalName;
如果您想对您的元素和所有子元素递归执行此操作,请使用以下内容:
private static void RemoveAllNamespaces(XElement element)
{
element.Name = element.Name.LocalName;
foreach (var node in element.DescendantNodes())
{
var xElement = node as XElement;
if (xElement != null)
{
RemoveAllNamespaces(xElement);
}
}
}
我想扩展现有答案。具体来说,我想参考一个从 XElement
中删除名称空间的常见用例,即:能够以通常的方式使用 Linq 查询。
当标签包含名称空间时,必须在每个 Linq 查询 (as explained in this answer) 中将此名称空间用作 XNamespace
,因此对于 OP 的 xml,它会是:
XNamespace ns = "http://www.blablabla.com/bla";
var element = xelement.Descendants(ns + "retEvent")).Single();
但通常情况下,我们不想每次都使用这个命名空间。所以我们需要删除它。
现在,@octaviocc 的建议确实从给定元素中删除了命名空间 属性 。但是,元素名称仍包含该命名空间,因此通常的 Linq 查询将无法工作。
Console.WriteLine(xelement.Attributes().Count()); // prints 1
xelement.Attributes().Where( e => e.IsNamespaceDeclaration).Remove();
Console.WriteLine(xelement.Attributes().Count()); // prints 0
Console.WriteLine(xelement.Name.Namespace); // prints "http://www.blablabla.com/bla"
XNamespace ns = "http://www.blablabla.com/bla";
var element1 = xelement.Descendants(ns + "retEvent")).SingleOrDefault(); // works
var element2 = xelement.Descendants("retEvent")).SingleOrDefault(); // returns null
因此,我们需要使用@Sam Shiles的建议,但可以简化(不需要递归):
private static void RemoveAllNamespaces(XElement xElement)
{
foreach (var node in xElement.DescendantsAndSelf())
{
node.Name = node.Name.LocalName;
}
}
如果需要使用 XDocument
:
private static void RemoveAllNamespaces(XDocument xDoc)
{
foreach (var node in xDoc.Root.DescendantsAndSelf())
{
node.Name = node.Name.LocalName;
}
}
现在可以使用了:
var element = xelement.Descendants("retEvent")).SingleOrDefault();
如何从 XElement 中删除 xmlns
命名空间?
我试过:attributes.remove
,xElement.Name.NameSpace.Remove(0)
,等等,等等,都没有成功。
我的xml:
<event xmlns="http://www.blablabla.com/bla" version="1.00">
<retEvent version="1.00">
</retEvent>
</event>
我怎样才能做到这一点?
您可以使用 IsNamespaceDeclaration 来检测哪个属性是命名空间
xelement.Attributes()
.Where( e => e.IsNamespaceDeclaration)
.Remove();
@octaviocc 的回答对我不起作用,因为 xelement.Attributes()
是空的,它没有将命名空间作为属性返回。
以下内容将删除您案例中的声明:
element.Name = element.Name.LocalName;
如果您想对您的元素和所有子元素递归执行此操作,请使用以下内容:
private static void RemoveAllNamespaces(XElement element)
{
element.Name = element.Name.LocalName;
foreach (var node in element.DescendantNodes())
{
var xElement = node as XElement;
if (xElement != null)
{
RemoveAllNamespaces(xElement);
}
}
}
我想扩展现有答案。具体来说,我想参考一个从 XElement
中删除名称空间的常见用例,即:能够以通常的方式使用 Linq 查询。
当标签包含名称空间时,必须在每个 Linq 查询 (as explained in this answer) 中将此名称空间用作 XNamespace
,因此对于 OP 的 xml,它会是:
XNamespace ns = "http://www.blablabla.com/bla";
var element = xelement.Descendants(ns + "retEvent")).Single();
但通常情况下,我们不想每次都使用这个命名空间。所以我们需要删除它。
现在,@octaviocc 的建议确实从给定元素中删除了命名空间 属性 。但是,元素名称仍包含该命名空间,因此通常的 Linq 查询将无法工作。
Console.WriteLine(xelement.Attributes().Count()); // prints 1
xelement.Attributes().Where( e => e.IsNamespaceDeclaration).Remove();
Console.WriteLine(xelement.Attributes().Count()); // prints 0
Console.WriteLine(xelement.Name.Namespace); // prints "http://www.blablabla.com/bla"
XNamespace ns = "http://www.blablabla.com/bla";
var element1 = xelement.Descendants(ns + "retEvent")).SingleOrDefault(); // works
var element2 = xelement.Descendants("retEvent")).SingleOrDefault(); // returns null
因此,我们需要使用@Sam Shiles的建议,但可以简化(不需要递归):
private static void RemoveAllNamespaces(XElement xElement)
{
foreach (var node in xElement.DescendantsAndSelf())
{
node.Name = node.Name.LocalName;
}
}
如果需要使用 XDocument
:
private static void RemoveAllNamespaces(XDocument xDoc)
{
foreach (var node in xDoc.Root.DescendantsAndSelf())
{
node.Name = node.Name.LocalName;
}
}
现在可以使用了:
var element = xelement.Descendants("retEvent")).SingleOrDefault();