2008-12-02 74 views
12

一個長期問題 - 請耐心等待!使用XElement中的名稱空間和模式創建XML

我想以編程方式創建一個名稱空間和模式的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類?

謝謝...

回答

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乙 - 我不能肯定我明白這一切,但是這個代碼讓我什麼,我需要......

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"
給出了一個在生成的XML中稱爲
xsi:schemaLocation
的屬性,這正是我所需要的。