Создание определенного XML-документа с использованием пространств имен в C#

Нам дали образец документа, и нужно точно воспроизвести структуру документа для поставщика. Однако я немного не понимаю, как С# обрабатывает пространства имен. Вот образец документа:

<?xml version="1.0" encoding="UTF-8"?>
<Doc1 xmlns="http://www.sample.com/file" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.sample.com/file/long/path.xsd">
    <header>
        <stuff>data</stuff>
        <morestuff>data</morestuff>
    </header>
 </Doc1>

Как я обычно это делаю, загружаю пустой документ, а затем начинаю его заполнять:

XmlDocument doc = new XmlDocument();
doc.LoadXml("<Doc1></Doc1>");
// Add nodes here with insert, etc...

Как только я запустил документ, как мне передать пространство имен и схему в элемент Doc1? Если я начну с пространства имен и схемы в элементе Doc1, включив их в LoadXml(), тогда все дочерние элементы будут иметь пространство имен на них — и это нет-нет. Документ отклонен.

Другими словами, я должен сделать это ТОЧНО так, как показано. (И я бы предпочел не просто писать текст в файл на С# и надеяться, что это допустимый XML).


person Clinton Pierce    schedule 14.01.2009    source источник


Ответы (4)


Вы должны попробовать это таким образом

  XmlDocument doc = new XmlDocument();  

  XmlSchema schema = new XmlSchema();
  schema.Namespaces.Add("xmlns", "http://www.sample.com/file");

  doc.Schemas.Add(schema);

Не забудьте включить следующие пространства имен:

using System.Xml.Schema;
using System.Xml;
person Dimi Takis    schedule 14.01.2009
comment
+1 за указание операторов использования, чтобы фрагмент кода действительно работал! - person Michael Rodrigues; 11.11.2013

Лично я предпочитаю использовать общий элемент XmlElement и его атрибуты для объявления пространств имен. Я знаю, что есть лучшие способы, но этот никогда не подводит.

Попробуйте что-то вроде этого:

xRootElement.SetAttribute("xmlns:xsi", "http://example.com/xmlns1");
person mathifonseca    schedule 12.12.2012
comment
Что такое xRootElement?? - person Shrivallabh; 07.04.2015
comment
экземпляр XmlElement :) - person mathifonseca; 07.04.2015

Если вы используете Visual Studio 2008, в папке Samples вы найдете пример надстройки, позволяющей вставлять XML-фрагмент как код Linq2XML.

Скотт Хансельман имеет запись блога с подробными сведениями.

Я думаю, что это самый быстрый способ перейти от образца XML-документа к коду C#, который его создает.

person Pop Catalin    schedule 14.01.2009
comment
Здесь пока нет .Net 3.0+. Еще 2.0. - person Clinton Pierce; 14.01.2009

Я нашел XDocument API гораздо более удобным, чем старый XmlDocument.

        XNamespace g = "http://base.google.com/ns/1.0";
        var doc = XDocument.Parse(templateFeed);
        var channel = doc.Descendants("rss").First();

        channel.Add(new XElement("item",
                    new XElement("description", "DDD23"),
                    new XElement(g + "image_link", "http://qqq2")
                 ));

        doc.Save("plik");
person vSzemkel    schedule 26.01.2021