2008-12-02 8 views
12

Долгосрочный вопрос - пожалуйста, несите меня!Создание 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 атрибуты?

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

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

Спасибо ...

ответ

7

Из этого article, похоже, что вы новый до более чем одного 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); 

Вот forum post, показывающий, как сделать SchemaLocation.

7

Благодаря David B - Я не совсем уверен, что я все это понимаю, но этот код получает, что мне нужно ...

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, который мне нужен.