2012-02-13 3 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

BTW, вывод, который вы получаете, содержит пространство имен, но не пространство имен по умолчанию. Это будет что-то вроде '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

Я не Не знаете, можете ли вы использовать его, но можете сделать это с 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 для управления файлом?

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

+0

уже у меня есть xml-файл, эта часть добавляется только в существующий xml-файл. – Usher

+0

Да, это идея примера. Первая строка создает объект xml (вы можете заменить его кодом для загрузки содержимого из файла). Остальное просто добавляет еще один узел в корневой узел. Надеюсь, это вам поможет. – Fabio

Смежные вопросы