5

我有一个 XElement,它的输出是

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

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

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

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

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

但我收到以下异常

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

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"/>

4

2 回答 2

9

是的,您需要指定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>
于 2012-05-09T18:21:45.360 回答
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);

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

于 2012-05-09T18:27:16.917 回答