Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XDocument中两个前缀不同的相同名称空间_C#_Xml_Linq To Xml - Fatal编程技术网

C# XDocument中两个前缀不同的相同名称空间

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/

因此,我尝试使用以下代码创建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/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时,应始终将默认名称空间作为最后一个属性。