2008-12-02 8 views
12

Một câu hỏi dài - hãy chịu với tôi!Tạo XML với các không gian tên và lược đồ từ XElement

Tôi muốn tạo một tài liệu XML theo cách có lập trình với các không gian tên và lược đồ. Một cái gì đó như

<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> 

Tôi đang sử dụng công cụ LINQ mới khá lộng lẫy (mới với tôi) và đang hy vọng thực hiện điều này bằng cách sử dụng XElement.

Tôi đã có một phương pháp ToXElement() trên đối tượng của tôi:

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

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

    return xe; 
    } 

mà mang lại cho tôi không gian tên một cách chính xác, do đó:

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

Câu hỏi của tôi: làm thế nào tôi có thể thêm xmlns schema : xsi và xsi: thuộc tính schemaLocation?

(BTW Tôi không thể sử dụng XAtttributes đơn giản như tôi nhận được một lỗi cho việc sử dụng dấu hai chấm ":" trong một tên thuộc tính ...)

Hoặc tôi cần phải sử dụng một XDocument hoặc một số lớp LINQ khác ?

Thanks ...

Trả lời

7

Từ article này, có vẻ như bạn mới lên nhiều hơn một XNamespace, thêm một thuộc tính trong thư mục gốc, và sau đó đi đến thị trấn với cả 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); 

Dưới đây là một forum post cho biết cách thực hiện phân bổ.

7

Nhờ David B - Tôi không hoàn toàn chắc chắn Tôi hiểu tất cả điều này nhưng mã này được tôi những gì tôi cần ...

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; 
    } 

Dường như concatenating một không gian tên cộng với một chuỗi ví dụ

w3nsp + "schemaLocation"
đưa ra một thuộc tính được gọi là
xsi:schemaLocation
trong XML kết quả, đó là những gì tôi cần.