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

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

<?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(), тогда все дочерние элементы будут иметь пространство имен на них - и это будет no-no. Документ отклонен.

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

Ответ 1

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

  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;

Ответ 2

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

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

xRootElement.SetAttribute("xmlns:xsi", "http://example.com/xmlns1");

Ответ 3

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

Скотт Гензельман имеет сообщение в блоге с детали.

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