Создание XML с пространствами имен и схемами из XElement - PullRequest
12 голосов
/ 02 декабря 2008

Длинный вопрос - пожалуйста, потерпите меня!

Я хочу программно создать XML-документ с пространствами имен и схемами. Что-то вроде

<myroot 
    xmlns="http://www.someurl.com/ns/myroot" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd">

    <sometag>somecontent</sometag>

</myroot>

Я использую довольно великолепный новый материал LINQ (что для меня ново), и надеялся сделать вышеизложенное с помощью XElement.

У меня есть метод ToXElement () для моего объекта:

  public XElement ToXElement()
  {
     XNamespace xnsp = "http://www.someurl.com/ns/myroot";

     XElement xe = new XElement(
        xnsp + "myroot",
           new XElement(xnsp + "sometag", "somecontent")
        );

     return xe;
  }

, который дает мне пространство имен правильно, таким образом:

<myroot xmlns="http://www.someurl.com/ns/myroot">
   <sometag>somecontent</sometag>
</myroot>

Мой вопрос: как добавить атрибуты схемы xmlns: xsi и xsi: schemaLocation?

(Кстати, я не могу использовать простые атрибуты XAtttributes, так как получаю ошибку при использовании двоеточия ":" в имени атрибута ...)

Или мне нужно использовать XDocument или какой-нибудь другой класс LINQ?

Спасибо ...

Ответы [ 2 ]

7 голосов
/ 03 декабря 2008

Спасибо Дэвиду Б. - Я не совсем уверен, что все это понимаю, но этот код дает мне то, что мне нужно ...

  public XElement ToXElement()
  {
     const string ns = "http://www.someurl.com/ns/myroot";
     const string w3 = "http://wwww.w3.org/2001/XMLSchema-instance";
     const string schema_location = "http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd";

     XNamespace xnsp = ns;
     XNamespace w3nsp = w3;

     XElement xe = new XElement(xnsp + "myroot",
           new XAttribute(XNamespace.Xmlns + "xsi", w3),
           new XAttribute(w3nsp + "schemaLocation", schema_location),
           new XElement(xnsp + "sometag", "somecontent")
        );

     return xe;
  }

Похоже, что конкатенация пространства имен плюс строка, например

w3nsp + "schemaLocation"
, дает в результате получаемый атрибут
xsi:schemaLocation
, что мне и нужно.
7 голосов
/ 02 декабря 2008

Из этой статьи выглядит, как будто вы новичок в нескольких XNamespace, добавили атрибут в корень и затем отправились в город с обоими XNamespaces.

// The http://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
///////////  I say, check out this line.
    new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
///////////
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

Вот сообщение на форуме , показывающее, как сделать схему размещения.

...