2008-09-14 40 views
32

Tôi đang cố gắng tạo sơ đồ trang web bằng cách sử dụng LINQ to Xml, nhưng tôi đang nhận được thuộc tính không gian tên trống, mà tôi muốn loại bỏ. ví dụ.Không gian tên trống bằng cách sử dụng LINQ Xml

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9"; 

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"), 
    new XElement(ns + "urlset", 

    new XElement("url", 
     new XElement("loc", "http://www.example.com/page"), 
     new XElement("lastmod", "2008-09-14")))); 

Kết quả là ...

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url xmlns=""> 
    <loc>http://www.example.com/page</loc> 
    <lastmod>2008-09-14</lastmod> 
    </url> 
</urlset> 

Tôi thà không có xmlns = "" trên các yếu tố url. Tôi có thể tách nó ra bằng cách sử dụng Thay thế trên xdoc.ToString cuối cùng(), nhưng là có một cách chính xác hơn?

Trả lời

43

Các "cách chính xác hơn" sẽ là:

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"), 
new XElement(ns + "urlset", 
new XElement(ns + "url", 
    new XElement(ns + "loc", "http://www.example.com/page"), 
    new XElement(ns + "lastmod", "2008-09-14")))); 

Tương tự như mã của bạn, nhưng với sự "ns +" trước mỗi tên yếu tố đó cần phải được trong không gian tên sitemap. Đủ thông minh để không đặt bất kỳ khai báo vùng tên không cần thiết nào trong kết quả XML, do đó kết quả là:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url> 
    <loc>http://www.example.com/page</loc> 
    <lastmod>2008-09-14</lastmod> 
    </url> 
</urlset> 

tức là, nếu tôi không nhầm, những gì bạn muốn.

+0

Rất đẹp. Cảm ơn. – peterorum

2

Nếu một phần tử sử dụng không gian tên, tất cả chúng phải sử dụng một. Trong trường hợp bạn không tự xác định khung, khung công tác sẽ thêm một vùng tên trống như bạn đã nhận thấy. Và, thật đáng buồn, không có chuyển đổi hoặc một cái gì đó tương tự để ngăn chặn "tính năng" này.

Vì vậy, có vẻ như không có phương pháp nào tốt hơn để tách nó ra. Sử dụng Thay thế ("xmlns = \" \ "", "") có thể nhanh hơn một chút so với thực thi RegEx.

4

Tôi tình cờ gặp bài đăng này trong khi xử lý sự cố tương tự trong VB.NET. Tôi đã sử dụng XML literals và nó đã cho tôi một số tìm kiếm để tìm ra cách để làm cho giải pháp này làm việc với việc xây dựng XML và không chỉ xây dựng chức năng.

Giải pháp là nhập không gian tên XML ở đầu tệp.

Imports <xmlns:ns="x-schema:tsSchema.xml"> 

Và sau đó tiền tố tất cả các chữ XML của tôi trong biểu thức truy vấn bằng không gian tên đã nhập. Điều này loại bỏ không gian tên trống đã xuất hiện trên các phần tử khi tôi lưu đầu ra của mình.

Dim output As XDocument = <?xml version="1.0" encoding="utf-8"?> 
           <XML ID="Microsoft Search Thesaurus"> 
            <thesaurus xmlns="x-schema:tsSchema.xml"> 
             <diacritics_sensitive>0</diacritics_sensitive> 
             <%= From tg In termGroups _ 
              Select <ns:expansion> 
                <%= From t In tg _ 
                 Select <ns:sub><%= t %></ns:sub> %> 
               </ns:expansion> %> 
            </thesaurus> 
           </XML> 

    output.Save("C:\thesaurus.xml") 

Tôi hy vọng điều này sẽ giúp ai đó. Bất chấp những va chạm trên con đường như thế này, API XLinq khá tuyệt vời.

Các vấn đề liên quan