【问题标题】:Linq to XML Disable default namespaceLinq to XML 禁用默认命名空间
【发布时间】:2015-01-06 18:53:46
【问题描述】:

我正在尝试使用 LINQ to XML 为 WebDAV 服务器编写查询,但我遇到了一个问题,即 LINQ 设置了 WebDAV 似乎不支持的默认命名空间 (xmlns = "bla")。

XNamespace ns = "d";
var content = new XElement(ns + "propfind"
,new XAttribute(XNamespace.Xmlns + "d", "DAV:")
,new XElement(ns + "allprops"));

预期的输出是:

<d:propfind xmlns:d="DAV:"><d:allprop /></d:propfind>

但无论我如何尝试序列化(即使使用XElement.Save(someStream, SaveOptions.DisableFormatting)),我总是得到我尝试访问的 WebDav 服务器不支持的这个。

<propfind xmlns:d="DAV:" xmlns="d"><allprop /></propfind>

【问题讨论】:

    标签: c# xml linq xml-namespaces


    【解决方案1】:

    问题是您的元素不在 DAV: 命名空间中 - 它在 d 命名空间中。您需要区分命名空间 URI 和命名空间别名。你想要:

    XNamespace ns = "DAV:";
    var content = new XElement(ns + "propfind",
        new XAttribute(XNamespace.Xmlns + "d", ns),
        new XElement(ns + "allprops"));
    

    【讨论】:

    • 嗯,好的,谢谢。因此,如果我理解正确,我仍然在我的所有定义中使用命名空间“DAV”,并且序列化将理解它应该使用我提供的别名作为“d”
    • @NtscCobalt: 是的 - 虽然它也是元素和后代的默认值,所以除非你想要别名,否则只需完全删除该属性...跨度>
    • 好吧有道理。是的,在这种情况下我需要别名。如果 DAV 被设置为根元素上的默认命名空间,IIS 会给我一个 400。
    猜你喜欢
    • 2018-05-21
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多