使用Elements将“XmlElement”转换为XElement(“ElementName”)将返回“无结果”

时间:2012-04-13 08:16:14

标签: c# xml xelement

我正在使用以下代码将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>

2 个答案:

答案 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);
}