我有一个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"/>
答案 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
元素本身)。