2009-08-20 34 views
0

私の質問は、同じ名前で異なる名前空間を持つ2つの属性に値を設定する方法です。明示的および暗黙的なXML名前空間

XML文書でC#を使用すると、要素に2つの属性を割り当てる必要があります。それは

のdocのxmlnsのようになります。XMI = "uriaddress" 要素のxsi:タイプ= "xsitype1" タイプ= "TYPE1" 私は

xElement.SetAttribute( "タイプ" を試してみました

を、 "uriaddress"、 "xsitype1")

これは問題なく機能します。また

しかし、私の驚きは

xElement.SetAttribute(「タイプ」、「TYPE1」)で、私は2番目の属性を設定しようとしたことを、「タイプ」である

これは動作しますが、それは属性xmi:typeを属性 "type"と同じ値にリセットし、意図しない方法で要素を変更します。

は今、要素は

要素のxsiのようになります。タイプ= "TYPE1" タイプ= "TYPE1"

これを回避する方法?

答えて

0

最初のSetAttribute呼び出しで間違った名前空間を入れたようです。

を助け、その名前空間あなただけの問題を示すしようとして

... XSIプレフィックスのではなく、XMI接頭辞の名前空間でなければならないので、私はここに間違った考えを得ているかもしれません

・ホープ

+0

感謝を。あなたは私のイラストだけが問題を抱えていると書いていました。文書内の名前空間は実際には xmlns:xsi = "uriaddress" です。残念ながら問題は残っています。 –

2

このコード:

XDocument d = new XDocument(); 
    XNamespace xsi = "uriaddress"; 
    d.Add(
     new XElement(
      "element", 
      new XAttribute(XNamespace.Xmlns + "xsi", "uriaddress"), 
      new XAttribute("type", "foo"), 
      new XAttribute(xsi + "type", "bar"))); 
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

    d.Element("element").SetAttributeValue("type", "baz"); 
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

    d.Element("element").SetAttributeValue(xsi + "type", "bar");   
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

この出力(空白を加え、XML宣言は読みやすくするために除去)を生成する:

<element xmlns:xsi="uriaddress" type="foo" xsi:type="bar" /> 

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bar" /> 

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bat" /> 

あなたは(あなたのオリジナルのポストから伝えるのは難しい)XDocumentを使用していない場合は、このコードは、本質的に同じ結果を生成します:答えるための試みのため

XmlDocument d = new XmlDocument(); 
    d.LoadXml("<element xmlns:xsi='uriaddress' type='foo' xsi:type='bar'/>"); 
    Console.WriteLine(d.OuterXml); 

    d.DocumentElement.SetAttribute("type", "baz"); 
    Console.WriteLine(d.OuterXml); 

    d.DocumentElement.SetAttribute("type", "uriaddress", "bat"); 
    Console.WriteLine(d.OuterXml); 
+0

Robert、 ご協力いただきありがとうございます。 少し違ってうまくいった。基本的にSetAttributeを直接使用するのではなく、最初に属性を別のオブジェクトとして作成した後、その属性を属性のリストに追加しました。あなたが投稿したコードからアイデアを得ました。私は再びあなたに感謝します。 マイク –

関連する問題