修改XElement以具有不同的内容

时间:2012-05-09 18:16:01

标签: .net xelement

我有一个XElement,它的输出是

<Email>address@email.com</Email>

。根据一些标准,我可能需要删除电子邮件地址并将其设置为null。我知道我可以设置element.Value =“”;但这不会做我想要的。我想修改它,所以输出将变为:

<Email xsi:nil=\"true\" />

我不想创建全新的节点,因为这是文档中的引用节点。我想保持节点在文档中的位置。 我试过了

emailItem.Add(new XAttribute("xsi:nil", "true"));

但我收到以下异常

  

':'字符,十六进制值0x3A,不能包含在a中   名称。   以下更改几乎可以正确创建节点:

XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";                                    
emailItem.Add(new XAttribute(xsi + "nil", true));
emailItem.Value =""; //How do I set to Null?

我最终使用<Email xsi:nil="true"></Email>代替<Email xsi:nil="true"/>

2 个答案:

答案 0 :(得分:8)

是的,您需要以不同方式指定XName;你不能只在这样的命名空间中创建一个XName

我怀疑你想要这个:

XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
emailItem.Document.Root.Add(new XAttribute(XNamespace.Xmlns + "xsi",
                            xsi.ToString()));
emailItem.Add(new XAttribute(xsi + "nil", true);

完整示例:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XDocument doc = new XDocument(new XElement("root"));
        XElement element = new XElement("email");
        doc.Root.Add(element);
        XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
        element.Document.Root.Add(
            new XAttribute(XNamespace.Xmlns + "xsi", xsi.ToString()));
        element.Add(new XAttribute(xsi + "nil", true));

        Console.WriteLine(doc);
    }
}

输出:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <email xsi:nil="true" />
</root>

答案 1 :(得分:1)

您可能希望xsi映射到XML架构实例命名空间,因此在这种情况下您需要指定:

    XElement root = new XElement("root");
    root.Add(new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"));
    XElement emailItem = XElement.Parse(@"<Email>address@email.com</Email>");
    root.Add(emailItem);
    emailItem.Add(new XAttribute(XName.Get("nil", "http://www.w3.org/2001/XMLSchema-instance"), "true"));
    Console.WriteLine(root);

请注意,您不需要root元素(我只是添加了它,以便命名空间声明不会转到Email元素本身)。