2012-11-28 74 views
2

鑑於以下XDocument,初始化爲變量xDoc合併的XElement到的XDocument和解決命名空間

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

我有嵌入在一個XML文件的模板(我們稱之爲body.xml):

<Body xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"> 
    <ReportItems />   
    <Height /> 
    <Style /> 
</Body> 

我想作爲<ReportSection>的孩子。問題是,如果通過XElement.Parse(body.xml)添加它,它會保留命名空間,即使我認爲命名空間應該被刪除(沒有重複自己的點 - 已經在父級上聲明)。如果我沒有指定名稱空間,它會放置一個空的名稱空間,因此它將變爲<Body xmlns="">

有沒有辦法將XElement合併爲XDocument?我想xDoc.Root.Element("ReportSection").AddFirst(XElement)後得到以下的輸出:

<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"> 
    <ReportSection> 
    <Body> 
     <ReportItems />   
     <Height /> 
     <Style /> 
    </Body> 
    <Width /> 
    <Page> 
    </ReportSections> 
</Report> 
+0

檢查了這一點:http://stackoverflow.com/questions/4985974/xelement-namespaces-how-to – Codeman

+1

@ Pheonixblade9:不幸的是,在我的情況下,XML不是由代碼創建的,因爲它是在StackOverflow的幾十個例子中完成的,包括一個你提到。從頭開始創建XElement並將其合併到XDocument中不是問題。這是關於XElement.Parse返回一個節點樹。 – Neolisk

回答

5

我不知道爲什麼會這樣,但是從身體內移除元素的屬性xmlns似乎工作:

var report = XDocument.Parse(
@"<Report xmlns=""http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition""> 
    <ReportSection> 
    <Width /> 
    <Page /> 
    </ReportSection> 
</Report>"); 

var body = XElement.Parse(
@"<Body xmlns=""http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition""> 
    <ReportItems />   
    <Height /> 
    <Style /> 
</Body>"); 

XNamespace ns = report.Root.Name.Namespace; 
if (body.GetDefaultNamespace() == ns) 
{ 
    body.Attribute("xmlns").Remove(); 
} 

var node = report.Root.Element(ns + "ReportSection"); 
node.AddFirst(body); 
+0

非常有趣。事實上,手動刪除'xmlns'屬性會使它工作。雖然首先沒有將它放在「身體」上是行不通的,但兩種選擇都應該產生相同的效果。感謝您挖掘它。 +1 – Neolisk

相關問題