2012-02-13 93 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 2012-02-13 17:40:06

回答

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

,非常感謝解釋和代碼too.I將從下一次使用Linq(它看起來很直截了當)。再次感謝 – Usher 2012-02-13 21:49:23

1

我不不知道你是否可以使用它,但你可以用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 2012-02-13 01:44:45

+0

除非你想在後處理XML中刪除它,我不知道如何。 – 2012-02-13 01:46:04

+1

@Usher - 我可能會說,我認爲單獨使用System.Xml.XmlDocument是不可能的(根據我所看到的情況,將我的脖子伸出一點點)。如果您試圖操縱* XML類似*不是真正XML的數據,那麼我會建議使用特定於任何格式的解析器。 – 2012-02-13 01:57:26

1

你不能使用LINQ to 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(); 

上述代碼產生以下結果:

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

無多餘命名空間信息。

+0

非常感謝,當我開始時我沒有想過Linq。看起來像Linq是處理它的最好方法。 – Usher 2012-02-13 01:42:12

+0

已經有了一個xml文件,這部分只附加到現有的xml文件。 – Usher 2012-02-13 01:46:31

+0

是的,這就是這個例子的想法。第一行產生一個xml對象(你可以用代碼替換它來加載文件中的內容)。剩下的只是在根節點添加另一個節點。希望這可以幫助你。 – Fabio 2012-02-13 18:25:43

相關問題