修改XElement以具有不同的内容

gre*_*eat 5 .net xelement

我有一个输出的XElement

<Email>address@email.com</Email>
Run Code Online (Sandbox Code Playgroud)

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

<Email xsi:nil=\"true\" />
Run Code Online (Sandbox Code Playgroud)

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

emailItem.Add(new XAttribute("xsi:nil", "true"));
Run Code Online (Sandbox Code Playgroud)

但是我收到了以下例外情况

':'字符,十六进制值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?
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 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);
Run Code Online (Sandbox Code Playgroud)

完整的例子:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <email xsi:nil="true" />
</root>
Run Code Online (Sandbox Code Playgroud)