显式和隐式XML名称空间

时间:2009-08-20 17:26:13

标签: c# xml namespaces

我的问题是如何将值设置为两个具有相同名称但名称空间不同的属性。

在XML文档中使用C#,我需要为元素分配两个属性。它应该看起来像

doc xmlns:xmi =“uriaddress” element xsi:type =“xsitype1”type =“type1”

我试过

xElement.SetAttribute( “类型”, “uriaddress”, “xsitype1”)

这很好用!

然而,令我惊讶的是,当我尝试通过

设置第二个属性“type”时

xElement.SetAttribute(“type”,“type1”)

这有效,但它也将属性xmi:type重置为与属性“type”相同的值,以非预期的方式更改元素。

现在该元素看起来像

元素xsi:type =“type1”type =“type1”

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

此代码:

    XDocument d = new XDocument();
    XNamespace xsi = "uriaddress";
    d.Add(
        new XElement(
            "element",
            new XAttribute(XNamespace.Xmlns + "xsi", "uriaddress"),
            new XAttribute("type", "foo"),
            new XAttribute(xsi + "type", "bar")));
    using (XmlWriter xw = XmlWriter.Create(Console.Out))
    {
        d.WriteTo(xw);
    }

    d.Element("element").SetAttributeValue("type", "baz");
    using (XmlWriter xw = XmlWriter.Create(Console.Out))
    {
        d.WriteTo(xw);
    }

    d.Element("element").SetAttributeValue(xsi + "type", "bar");        
    using (XmlWriter xw = XmlWriter.Create(Console.Out))
    {
        d.WriteTo(xw);
    }

生成此输出(添加了空格并删除了XML声明以提高可读性):

<element xmlns:xsi="uriaddress" type="foo" xsi:type="bar" />

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bar" />

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bat" />

如果您没有使用XDocument(很难从原始帖子中说出来),此代码会产生基本相同的结果:

    XmlDocument d = new XmlDocument();
    d.LoadXml("<element xmlns:xsi='uriaddress' type='foo' xsi:type='bar'/>");
    Console.WriteLine(d.OuterXml);

    d.DocumentElement.SetAttribute("type", "baz");
    Console.WriteLine(d.OuterXml);

    d.DocumentElement.SetAttribute("type", "uriaddress", "bat");
    Console.WriteLine(d.OuterXml);

答案 1 :(得分:0)

在我看来,就像你在第一个SetAttribute调用中输入了错误的命名空间一样。该命名空间应该是xsi前缀的命名空间,而不是xmi前缀...

你可能只是试图证明这个问题,所以我可能在这里得到了错误的想法

希望有所帮助