<div xmlns="http://www.com">
<div class="child">
</div>
</div>
当我使用XPath获取子元素,做.ToString()
,它增加了父命名空间给它。我如何获得没有冗余名称空间的内容?XNode到字符串的子元素没有命名空间
<div xmlns="http://www.com">
<div class="child">
</div>
</div>
当我使用XPath获取子元素,做.ToString()
,它增加了父命名空间给它。我如何获得没有冗余名称空间的内容?XNode到字符串的子元素没有命名空间
您可以使用此扩展方法。它将递归地创建另一个XElement,包括其子名称空间。扩展方法需要放在静态类中:
public static XElement IgnoreNamespace(this XElement xelem)
{
XNamespace xmlns = "";
var name = xmlns + xelem.Name.LocalName;
return new XElement(name,
from e in xelem.Elements()
select e.IgnoreNamespace(),
xelem.Attributes()
);
}
static void Main(string[] args)
{
var document = XDocument.Parse("<?xml version=\"1.0\" ?><div xmlns=\"http://www.ya.com\"><div class=\"child\"></div></div>");
var first = document.Root.Elements().First().IgnoreNamespace();
Console.WriteLine(first.ToString());
}
拉曼的答案是好的,但这样它不会对XML的工作:
<div xmlns="http://www.ya.com">
<div class="child">
**This is some text**
</div>
</div>
这是我的改进版本,将工作:
public static XElement IgnoreNamespace(this XElement xelem)
{
XNamespace xmlns = "";
var name = xmlns + xelem.Name.LocalName;
var result = new XElement(name,
from e in xelem.Elements()
select e.IgnoreNamespace(),
xelem.Attributes()
);
if (!xelem.HasElements)
result.Value = xelem.Value;
return result;
}
这里提供的答案都不适用于我。对于在此处登陆的其他人,请使用我自己的大型xaml文件进行测试,并在代码段中包含样本。
let stripNamespaces (e:XElement):XElement=
// if the node is not XElement, pass through
let rec stripNamespaces (n:XNode): XNode =
match n with
| :? XElement as x ->
let contents =
x.Attributes()
// strips default namespace, but not other declared namespaces
|> Seq.filter(fun xa -> xa.Name.LocalName <> "xmlns")
|> Seq.cast<obj>
|> List.ofSeq
|> (@) (
x.Nodes()
|> Seq.map stripNamespaces
|> Seq.cast<obj>
|> List.ofSeq
)
XElement(XNamespace.None + x.Name.LocalName, contents |> Array.ofList) :> XNode
| x -> x
stripNamespaces e :?> XElement
感谢:
在
F#
作为第一个写的。我会尝试一下 – user460025 2012-07-13 22:11:02