Создание XML с пространствами имен и схемами из XElement
Длинный вопрос - пожалуйста, потерпите меня!
Я хочу программно создать 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 ответа
Из этой статьи похоже, что вы создали несколько новых XNamespace, добавили атрибут в корень и затем отправились в город с обоими XNamespace.
// 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);
Вот сообщение на форуме, показывающее, как сделать схему размещения.
Спасибо Дэвиду Б. - Я не совсем уверен, что понимаю все это, но этот код дает мне то, что мне нужно...
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в результирующем XML, что мне и нужно.