2012-02-13 5 views
4

xmlファイルを既存のファイルに追加しようとしましたが、すべて正常に機能しますが、追加時にデフォルトの名前空間で問題が発生します。XML文書を追加するときにデフォルト名前空間が作成される

これは私が追加するために使用するコードです:

XmlNode newChild = doc.CreateNode(XmlNodeType.Element, "image", ""); 
    newChild.Attributes.Append(doc.CreateAttribute("name", filename)); 

    XmlNode xmlElement = doc.CreateNode(XmlNodeType.Element, "width", null); 
    xmlElement.InnerText = widthValue[1].TrimStart(); 
    newChild.AppendChild(xmlElement); 

<image d2p1:name="" xmlns:d2p1="test.jpg"> 
    <width>1024</width> 
</image> 

以下のような出力を取得していますが、私は次のように追加しようとしていた。

<image name="test.jpg"> 
    <width>1024</width> 
</image> 
+0

ところで、出力には名前空間が含まれていますが、デフォルトの名前空間は含まれていません。これは 'xmlns =" something "のようなもので、属性には影響しません。 – svick

答えて

3

他にも示唆されているように、LINQ to XMLを使用する方が一般的には簡単です。

しかし、あなたは、XmlDocumentを使用してに固執する問題を修正するために、次のようにコードを変更したい場合:

var attribute = doc.CreateAttribute("name"); 
attribute.Value = filename; 
newChild.Attributes.Append(attribute); 

あなたが持っているコードの問題がdoc.CreateAttribute("foo", "bar")は、名前の属性を作成することですfoo URI barを持つ名前空間に追加します。それは本当にあなたが望むものではありません。

+0

、ありがとう、説明とコードもありがとう。私は次回以降Linqを使用する(それはかなりまっすぐに見える)。再度、感謝します – Usher

1

Iドンあなたがそれを使用することができるかどうかを知っているが、Linq To Xmlで次のようにすることができる:

// NOTE: Requires `using System.Xml.Linq;` 
var newChild = new XElement("image"); 
newChild.Add(new XAttribute("name", filename)); 
doc.Add(newChild); 

XElement xmlElement = new XElement("width"); 
xmlElement.Value = widthValue[1].TrimStart(); 
newChild.Add(xmlElement); 
+0

、おかげさまでありがとうございました。XMLを使用している途中で、これはとにかく私はデフォルトの名前空間を削除できますか? – Usher

+0

XMLの後処理で削除しない限り、どうやって削除するか分かりません。 –

+1

@ Usher - おそらく私は 'System.Xml.XmlDocument'だけでは(私の見ていることに基づいて私の首をちょっと外して)それが可能ではないと言えると思います。 XMLではない* XMLのような*データを操作しようとしているなら、どんな形式のパーサーでも使うことをお勧めします。 –

1

LINQ to XMLを使用してファイルを操作できませんか?

<xml> 
    <image name="first_image.jpg"> 
    <width>800</width> 
    </image> 
    <image name="test.jpg"> 
    <width>1024</width> 
    </image> 
</xml> 

不要な名前空間情報:

var xml = XDocument.Parse(@"<xml><image name=""first_image.jpg""><width>800</width></image></xml>"); 
xml.Root.Add(new XElement("image", new XAttribute("name", "test.jpg"), new XElement("width", "1024"))); 
var result = xml.ToString(); 

上記のコードは、次の結果を生成します。

+0

ありがとう、Linqについて私はstartin.Lookと考えていないLinqのように扱うための最善の方法です。 – Usher

+0

すでにxmlファイルがありますが、この部分は既存のxmlファイルにのみ追加されます。 – Usher

+0

はい、その例のアイデアです。最初の行はxmlオブジェクトを生成します(ファイルから内容を読み込むコードに置き換えることができます)。残りの部分は、ルートノードに別のノードを追加するだけです。これがあなたを助けることを願っています – Fabio

関連する問題