5

私はそれが出力するXElementを持っています

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

。いくつかの基準に基づいて、メールアドレスを削除してnullに設定する必要があるかもしれません。element.Value = "";を設定できますか?しかし、それは私が望むことをしません。出力が次のようになるように変更したいと思います。

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

これはドキュメント内の参照ノードであるため、新しいノードを作成したくありません。そして、ドキュメント内のノードを保持したいと思います。私は試した

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

しかし、私は次の例外を受け取りました

':'文字(16進値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

Yes, you need to specify the XName differently; you can't just create an XName in a namespace like that.

I suspect you want this:

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);

Complete example:

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);
    }
}

Output:

<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 に答える