2012-05-12 10 views
5

Tôi có Chương trình C# để tạo tệp RDL cho whitch Hiển thị báo cáo trong dịch vụ báo cáo. Tôi sử dụng LINQ to Xml để tạo Xml.Thêm thuộc tính xmlns vào phần tử gốc

Khi tôi cố thêm xmlns XAttribute vào phần tử báo cáo, tôi gặp phải một số sự cố.

tôi thử nghiệm phương pháp sau đây:

đầu tiên:

 XDocument d = new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement("Report", 
       new XAttribute(XNamespace.Xmlns + "rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"), 
       new XAttribute(XNamespace.Xmlns + "cl", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition"), 
       new XAttribute("xmlns", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"), 
        new XElement("DataSources", ""), 
        new XElement("DataSets", ""), 
        new XElement("ReportSections", 

này là một phần của mã phù thủy chương trình của tôi như thế nào tạo ra xml:

thứ hai:

XNamespace reportDef = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"; 
     XDocument d = new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement(reportDef + "Report", 
       new XAttribute(XNamespace.Xmlns + "rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"), 
       new XAttribute(XNamespace.Xmlns + "cl", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition"), 
        new XElement("DataSources", ""), 
        new XElement("DataSets", ""), 
        new XElement("ReportSections",... 

Phương thức đầu tiên trả về một lỗi và phương thức thứ hai thêm thuộc tính xmlns cho tất cả nút con.

Tôi muốn định dạng này:

<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"> 

Trả lời

4

Cố gắng thêm bạn nút con bằng cách sử dụng XNamespace như mô tả trong How to: Create a Document with Namespaces (C#) (LINQ to XML)

XNamespace reportDef = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"; 
XElement root = new XElement(reportDef + "Report", 
    new XElement(reportDef + "Child", "child content")); 

này sẽ cho bạn kết quả mong muốn.

Bạn cũng có thể thêm một không gian tên mặc định bằng cách thêm một xmlns thuộc tính

XElement xe = new XElement(reportDef + "Report", 
    new XAttribute("xmlns", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"), 
    new XElement(reportDef + "Child", "child content")); 
+1

Tôi sử dụng giải pháp này nhưng không may là trước khi thuộc tính này thêm vào tất cả các nút con. –

+0

Có vẻ lạ vì tôi không thể tái tạo điều này.Hãy thử thêm thuộc tính không gian tên mặc định như trong ví dụ thứ hai của tôi. Có thể cập nhật câu hỏi của bạn và hiển thị thêm mã thực của bạn. – Filburt

+0

Thật không may nó như trước –

2

Bạn có thể nhìn thấy từ @ câu trả lời Filburt và this bưu điện, mà tính xmlns là một thuộc tính đặc biệt. Nó chỉ có thể được truy cập thông qua lớp XNamespace.

Dưới đây tôi sẽ cung cấp cho bạn một ví dụ về cách tạo không gian tên. Bạn nên xem How to: Create a Document with Namespaces để biết thêm thông tin. Lý do mã của bạn là thêm xmlns thẻ cho tất cả trẻ em là vì bạn không tạo tất cả các nút con trong cùng một không gian tên.

  1. Để đặt các phần tử vào không gian tên mặc định, hãy tạo XNamespace (xem ns1 bên dưới) và thêm giá trị vào tên phần tử. Ví dụ: new XElement(ns1 + "Report"); Điều này tạo ra một phần tử <Report> trong không gian tên ns1 và không có tiền tố.
  2. Để thêm các không gian tên bổ sung, hãy thêm một thuộc tính với không gian tên và tiền tố. Ví dụ: new XAttribute(XNamespace.Xmlns + "ns2", ns2) thêm vùng tên vào phần tử <Report> với tiền tố ns2. Sau đó, mỗi khi bạn tạo một phần tử (new XElement(ns2+"DataSources")) với không gian tên ns2, tiền tố sẽ được sử dụng. Tiền tố có thể được sử dụng trong tất cả các con cháu dưới phần tử có khai báo tiền tố. Đây là nơi bạn đã phạm sai lầm.

    StringBuilder sb = new StringBuilder(); 
        XmlWriterSettings xws = new XmlWriterSettings(); 
        xws.OmitXmlDeclaration = true; 
        xws.Indent = true; 
    
        using (XmlWriter xw = XmlWriter.Create(sb, xws)) 
        { 
         XNamespace ns1 = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"; 
         XNamespace ns2 = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"; 
         XNamespace ns3 = "http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition"; 
         XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes")); 
         XElement reportElement = new XElement(ns1 + "Report", 
          new XAttribute(XNamespace.Xmlns + "ns2", ns2), 
          new XAttribute(XNamespace.Xmlns + "ns3", ns3)); 
         doc.Add(reportElement); 
    
         reportElement.Add(new XElement(ns2+"DataSources")); 
         reportElement.Add(new XElement(ns3+"DataSets")); 
         reportElement.Add(new XElement(ns1+"ReportSections")); 
    
         doc.WriteTo(xw); 
        } 
    
        System.Diagnostics.Debug.Write(sb.ToString()); 
    
+0

Có tất cả các nút con tạo cùng một cách. Tôi chỉnh sửa mã mẫu đầu tiên và thứ hai. xin vui lòng kiểm tra xem nó. cảm ơn –

+0

@AmirReza Tôi đã thêm một ví dụ và ghi nhận sai lầm của bạn. Về cơ bản, bạn cần phải đặt 'XElement mới (reportDef +" DataSources "," ")' thay vì 'mới XElement (" DataSources "," ")'. Không gian tên bị thiếu ở trẻ em nên chúng sẽ kết thúc trong không gian tên trống. – user845279