当我尝试从文本中解析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);
}
}
默认命名空间仍为空。
答案 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"
。