C# 将XElement合并到XDocument并解析名称空间
给定以下C# 将XElement合并到XDocument并解析名称空间,c#,xml,vb.net,linq-to-xml,xelement,C#,Xml,Vb.net,Linq To Xml,Xelement,给定以下XDocument,初始化为变量xDoc: <Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"> <ReportSection> <Width /> <Page> </ReportSections> </Report> 我想把它作为的孩子。问题是,如果通过XElem
XDocument
,初始化为变量xDoc
:
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
<ReportSection>
<Width />
<Page>
</ReportSections>
</Report>
我想把它作为
的孩子。问题是,如果通过XElement.Parse(body.xml)
添加它,它会保留名称空间,即使我认为名称空间应该被删除(复制它本身没有意义-已经在父级上声明)。如果我不指定名称空间,它将放置一个空名称空间,因此它将成为
是否有方法将XElement
正确合并到XDocument
?我希望在xDoc.Root.Element(“ReportSection”).AddFirst(XElement)
之后获得以下输出:
我不确定为什么会发生这种情况,但是从body元素中删除
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);
var report=XDocument.Parse(
@"
");
var body=XElement.Parse(
@"
");
XNamespace ns=report.Root.Name.Namespace;
if(body.GetDefaultNamespace()==ns)
{
属性(“xmlns”).Remove();
}
var节点=report.Root.Element(ns+“ReportSection”);
node.AddFirst(body);
请检查:@Pheonixblade9:不幸的是,在我的例子中,XML不是由代码创建的,正如StackOverflow的几十个示例中所做的那样,包括您提到的示例。从头创建XElement并将其合并到XDocument中不是问题。这是关于XElement的。解析返回一个节点树。非常有趣。实际上,手动删除xmlns
属性可以使其正常工作。虽然两个选项本应产生相同的效果,但如果不将其置于主体上,则不起作用。谢谢你把它挖出来+1.
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
<ReportSection>
<Body>
<ReportItems />
<Height />
<Style />
</Body>
<Width />
<Page>
</ReportSections>
</Report>
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);