我正在使用以下代码将XmlElement
转换为XElement
public staic XElement ToXElement(this XmlNode node) {
XElement element = null;
if (null != node) {
element = XElement.Parse(node.OuterXml);
}
return element;
}
但是,当我致电Elements()
或Elements("ElementName")
时,我没有收到任何结果
但是我会通过调用Nodes()
来获得结果。
为什么元素不会来自调用元素,这两种方法之间有什么区别?
这是我正在解析的xml的snippit。
<Feature xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementFile Location="Path/file.xml"/>
</ElementManifests>
</Feature>
答案 0 :(得分:2)
您可能没有正确使用命名空间。这两种方法都适用于我:
XElement root = XElement.Load("test.xml"); //or result of ToXElement
foreach(var item in root.Elements())
{
Console.WriteLine(item.Name);
}
XNamespace ns = "http://schemas.microsoft.com/sharepoint/";
var manifestsNode = root.Element(ns + "ElementManifests");
鉴于您不知道Elements()
(获取所有直接孩子)和Element()
(获取一个特定的直接子元素)之间的区别,您应该从Linq to Xml教程开始。< / p>
答案 1 :(得分:0)
测试此代码:
var Status = xn["Feature"];
foreach (XmlElement element in Status) {
XElement withoutXmlnsElement =RemoveAllNamespaces(XElement.Parse(element.OuterXml));
}
public static XElement RemoveAllNamespaces(XElement e) {
return new XElement(e.Name.LocalName,
(from n in e.Nodes()
select ((n is XElement) ? RemoveAllNamespaces(n as XElement) : n)),
(e.HasAttributes) ? (from a in e.Attributes()
where (!a.IsNamespaceDeclaration) select new
XAttribute(a.Name.LocalName,a.Value)) : null);
}