为XDocument指定默认名称空间会给出空值

时间:2015-05-27 17:15:55

标签: c# xml linq-to-xml

当我尝试从文本中解析XDocument时,我可以得到这样的默认命名空间:

var xmlDocument1 = XDocument.Parse("<root xmlns='http://somenamespace'></root>");
var xmlNamespace1 = xmlDocument1.Root.GetDefaultNamespace().NamespaceName; // somenamespace

但是,如果我尝试手动创建XDocument,我会得到一个空值:

var xmlRoot2 = new XElement(XName.Get("root", "http://somenamespace"));
var xmlDocument2 = new XDocument(xmlRoot2);
var xmlNamespace2 = xmlDocument2.Root.GetDefaultNamespace().NamespaceName; // is empty

我希望xmlNamespace2为&#34; http://somenamespace&#34;。我有什么不对的吗?

修改:即使我使用此处建议的功能,建议重复的答案也无法解决我的问题: How to set the default XML namespace for an XDocument 我仍然会获得空命名空间。以下是链接问题的解决方案:

class Program
{
    static void Main(string[] args)
    {
        var xmlRoot = new XElement(XName.Get("root"));
        var xmlDocument = new XDocument(xmlRoot);
        SetDefaultXmlNamespace(xmlRoot, "http://somenamespace");
        var xmlNamespace = xmlDocument.Root.GetDefaultNamespace().NamespaceName; // is empty
    }

    public static void SetDefaultXmlNamespace(XElement xelem, XNamespace xmlns)
    {
        if (xelem.Name.NamespaceName == string.Empty)
            xelem.Name = xmlns + xelem.Name.LocalName;
        foreach (var e in xelem.Elements())
            SetDefaultXmlNamespace(e, xmlns);
    }
}

默认命名空间仍为空。

2 个答案:

答案 0 :(得分:4)

我想我理解为什么我没有获得默认命名空间。根据{{​​3}}:

  

使用C#创建XML树时,即使是XML树也是如此   如果命名空间未持久化,则使用默认命名空间序列化   在XML树中作为属性,此方法不会报告   namespace作为默认命名空间。

所以我可能需要明确设置xmlns属性:

class Program
{
    static void Main(string[] args)
    {
        var xmlRoot = new XElement(XName.Get("root", "http://somenamespace"));
        xmlRoot.SetAttributeValue("xmlns", "http://somenamespace");
        var xmlDocument = new XDocument(xmlRoot);
        var xmlNamespace = xmlDocument.Root.GetDefaultNamespace().NamespaceName;
    }
}

现在我获得了正确的命名空间名称。

答案 1 :(得分:1)

是的,很棘手,因为即使字符串表示看起来没问题,它仍然无效。

对于教育,请添加:

var xml3 = xmlDocument2.ToString();
var xmlDocument3 = XDocument.Parse(xml3);            
var xmlNamespace3 = xmlDocument3.Root.GetDefaultNamespace().NamespaceName;

因此,只有在您再次解析xml文本之后,才会出现这种情况。

这可能是最简短的方法:

var xmlRoot2 = new XElement(XName.Get("root", "http://somenamespace"), 
       new XAttribute("xmlns", "http://somenamespace"));

使用预定义的XNameSpace.Xmlns对默认(无前缀)命名空间不起作用,因此只需要"xmlns"