有没有办法将默认命名空间设置为从 XDocument 查询?

Posted

技术标签:

【中文标题】有没有办法将默认命名空间设置为从 XDocument 查询?【英文标题】:Is there a way to set the default namespace to query from an XDocument? 【发布时间】:2011-08-08 18:29:09 【问题描述】:

我不想在每个元素名称中都包含xmlns + "ElementName"

XDocument xml = XDocument.Load(@"C:\file.xml");
XNamespace xmlns = "http://www.com/namespace";
var vehicles = from vehicle in xml.Descendants(xmlns + "Element")
               select vehicle.Element(xmlns + "Item")
;

【问题讨论】:

可以将xmlns 转换为string 吗?可以这样做xml = xml.Replace(xmlns.ToString(), "")吗? 【参考方案1】:

不幸的是,这是您在使用 LINQ to XML 时必须做的事情。每次在文档中查询特定元素时,都必须提供命名空间。

【讨论】:

【参考方案2】:

看起来 Scott Hanselman 不久前写过一些笔记。可能不完全是您要查找的内容(帖子中有一些 Linq to XML 示例),但无论如何,这是链接:http://www.hanselman.com/blog/GetNamespacesFromAnXMLDocumentWithXPathDocumentAndLINQToXML.aspx

另请参阅这个 SO 问题:How to set the default XML namespace for an XDocument

【讨论】:

【参考方案3】:

即使为时已晚,但也许它可以帮助像我这样的其他人!

您可以添加一个扩展方法来充当内置方法的包装器!

像这样:

public static class XDoncumentExtentions

    private static string DefaultNamespace = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
    public static IEnumerable<XElement> DescendantsSimple(this XContainer me, string simpleName)
    
        return me.Descendants(string.Format("01", DefaultNamespace, simpleName));
    

    public static IEnumerable<XElement> ElementsSimple(this XContainer me, string simpleName)
    
        return me.Elements(string.Format("01", DefaultNamespace, simpleName));
    

    public static XElement ElementSimple(this XContainer me, string simpleName)
    
        return me.Element(string.Format("01", DefaultNamespace, simpleName));
    

【讨论】:

以上是关于有没有办法将默认命名空间设置为从 XDocument 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有默认命名空间的 xml 文档上使用 XPath

有没有办法只解除非命名空间事件的绑定?

COM Interop的重命名/前缀类

Python ElementTree默认命名空间?

如何在 Kubernetes 中切换命名空间

视图命名空间上的 Laravel 视图组件支持