簡體   English   中英

如何擺脫像這樣(C#)的XElement的命名空間前綴?

[英]How can I get rid of the namespace prefix from XElement like this (C#)?

我有一個像這樣的xml字符串,並且我試圖將其反序列化為帶有Credentials類的對象。 但是名稱空間前綴使我停了下來。

Credentials類本身沒有任何XmlRoot屬性來設置名稱空間。 但是某些包含Credentials屬性的類卻可以。 下面的“ ds”前綴來自容器的序列化xml。

容器的xml如下所示:

<ds:DataSource xmlns:ds="urn:My-Namespace">
    <ds:Credentials>
        <ds:UserName>foo</ds:UserName>
        <ds:Domain>bar</ds:Domain>
    </ds:Credentials>
</ds:DataSource>"

然后,當我從containter元素獲取元素“ Credentials”時,它返回以下內容:

<ds:Credentials xmlns:ds="urn:My-Namespace">
    <ds:UserName>foo</ds:UserName>
    <ds:Domain>bar</ds:Domain>
</ds:Credentials>

由於多余的命名空間,我無法將其反序列化為正確的Credentials對象。 有可能將其刪除嗎? 我嘗試過如何刪除名稱空間前綴。 (C#) ,該元素仍然在此處具有默認名稱空間。

<Credentials xmlns="urn:My-Namespace">
    <UserName>foo</UserName>
    <Domain>bar</Domain>
</Credentials>

MSDN中有一篇文章,可以根據您的需要進行修改: 如何:更改整個XML樹的命名空間

基本上,本文建議將樹中每個XElement Name更改為新的Name (FYI, Name屬性包含有關名稱空間和本地名稱的信息)。 在這種情況下,由於我們希望將每個元素更改為無名稱空間,因此可以將Name更改為相應的Name.LocalName

var xml = @"<ds:DataSource xmlns:ds=""urn:My-Namespace"">
    <ds:Credentials>
        <ds:UserName>foo</ds:UserName>
        <ds:Domain>bar</ds:Domain>
    </ds:Credentials>
</ds:DataSource>";
var tree1 = XElement.Parse(xml);
foreach (XElement el in tree1.DescendantsAndSelf())
{
    el.Name = el.Name.LocalName;
    List<XAttribute> atList = el.Attributes().ToList();
    el.Attributes().Remove();
    foreach (XAttribute at in atList)
        el.Add(new XAttribute(at.Name.LocalName, at.Value));
}
//remove xmlns:ds="urn:My-Namespace"
tree1.RemoveAttributes();
//print result to console
Console.WriteLine(tree1.ToString());

感謝har07和http://bohu7.wordpress.com/2008/12/11/removing-default-namespaces-from-an-xdocument/的啟發,我自己制定了解決方案,它將保留常規屬性並刪除其他名稱空間:

    public static void RemoveNamespace(this XElement element)
    {
        foreach (XElement e in element.DescendantsAndSelf())
        {
            if (e.Name.Namespace != XNamespace.None)
                e.Name = e.Name.LocalName;

            if (e.Attributes().Any(a => a.IsNamespaceDeclaration || a.Name.Namespace != XNamespace.None))
                e.ReplaceAttributes(e.Attributes().Select(NoNamespaceAttribute));
        }
    }

    private static XAttribute NoNamespaceAttribute(XAttribute attribute)
    {
        return attribute.IsNamespaceDeclaration
            ? null
            : attribute.Name.Namespace != XNamespace.None
                ? new XAttribute(attribute.Name.LocalName, attribute.Value)
                : attribute;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM