C# XDocument中两个前缀不同的相同名称空间
因此,我尝试使用以下代码创建Xml文档:C# XDocument中两个前缀不同的相同名称空间,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,因此,我尝试使用以下代码创建Xml文档: XNamespace spr1 = "urn:schemas-microsoft-com:office:spreadsheet"; XNamespace ex = "urn:schemas-microsoft-com:office:excel"; XNamespace spr2 = "urn:schemas-microsoft-com:office:spreadsheet"; XNamespace rec = "http://www.w3.org/TR/
XNamespace spr1 = "urn:schemas-microsoft-com:office:spreadsheet";
XNamespace ex = "urn:schemas-microsoft-com:office:excel";
XNamespace spr2 = "urn:schemas-microsoft-com:office:spreadsheet";
XNamespace rec = "http://www.w3.org/TR/REC-html40";
var xworkbook = new XElement(spr1 + "Workbook");
xworkbook.Add(new XAttribute(XNamespace.Xmlns + "x", ex));
xworkbook.Add(new XAttribute(XNamespace.Xmlns +"ss", spr2));
xworkbook.Add(new XAttribute(XNamespace.Xmlns + "html", rec));
此代码生成下一个xml:
<ss:Workbook xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<!--Xml body-->
</ss:Workbook>
但我预计:
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
</Workbook>
如何构建不带“ss”前缀且具有所需“xmlns”属性的工作簿元素?我通常这样做
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string xml =
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
"<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"" +
" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"" +
" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"" +
" xmlns:html=\"http://www.w3.org/TR/REC-html40\">" +
"</Workbook>";
XDocument doc = XDocument.Parse(xml);
XElement workbook = (XElement)doc.FirstNode;
XNamespace ssNs = workbook.GetNamespaceOfPrefix("ss");
XElement worksheet = new XElement(ssNs + "Worksheet");
workbook.Add(worksheet);
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串xml=
"" +
"" +
"";
XDocument doc=XDocument.Parse(xml);
XElement工作簿=(XElement)doc.FirstNode;
XNamespace ssNs=workbook.GetNamespaceOfPrefix(“ss”);
XElement工作表=新XElement(ssNs+“工作表”);
工作簿。添加(工作表);
}
}
}
LINQ to XML使用最接近的名称空间前缀,因为它按从当前元素到根元素的相反顺序查看所有属性。因此,如果在末尾显式添加默认名称空间,则Workbook
将使用该名称空间,而不是ss
前缀
XNamespace ss = "urn:schemas-microsoft-com:office:spreadsheet";
XNamespace ex = "urn:schemas-microsoft-com:office:excel";
XNamespace html = "http://www.w3.org/TR/REC-html40";
var workbook = new XElement(
ss + "Workbook",
new XAttribute(XNamespace.Xmlns + "x", ex),
new XAttribute(XNamespace.Xmlns + "ss", ss),
new XAttribute(XNamespace.Xmlns + "html", html),
new XAttribute("xmlns", ss)
);
这将为您提供以下XML:
<Workbook xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns="urn:schemas-microsoft-com:office:spreadsheet" />
如评论中所述,您问题中的两个文档在语义上是相同的。任何XML解析器都不应该关心这两个文档之间的差异。为什么?当前格式有什么问题?请记住,前缀仅在XML文档的本地上下文中有任何意义<从逻辑角度来看,code>和
是完全相同的东西。它们都在描述urn:def
名称空间中的a
元素。@Damien_不信者,尽管它们应该是完全相同的东西,但我记得微软Office非常注重元素的命名方式和名称空间的声明方式,OP可能会遇到类似的问题。似乎XDocument
可能没有一种方式来表示您试图创建的内容。即使我在第二位XML上使用XElement.Parse()
,它仍然会将元素的名称空间前缀更改为ss:
。旧式的XmlDocument
API没有此问题。也许您可以使用@JLRishe XDocument作为回复,我认为它比XmlDocument更有用,但这是一种变通方法。我会检查你的答案,如果我找不到另一个解决方案。不知道为什么你认为这是一个工作,因为它的工作。Net中的名称空间有缺陷,我发现仅仅解析名称空间要比试图让Net库正常工作容易得多。此外,我的代码更容易理解。使用Net library时,应始终将默认名称空间作为最后一个属性。