【问题标题】:Generate XML in C# Using Specific XML Namespace使用特定的 XML 命名空间在 C# 中生成 XML
【发布时间】:2020-01-07 22:00:16
【问题描述】:

我想要实现的目标 XML:

<Row><Data ss:Type="String">value</Data></Row>

我目前得到的输出:

<Row xmlns=""><Data Type="Number">0</Data></Row>

我正在尝试使用 System.Xml 库创建目标 XML 代码,但是当我创建新元素时没有显示名称空间前缀。生成上述输出的代码片段:

XmlElement eRow = xDoc.CreateElement("Row");
XmlElement eData = xDoc.CreateElement("Data");
XmlAttribute xAt = xDoc.CreateAttribute("ss", "Type", null);
xAt.Value = "Number";
eData.Attributes.Append(xAt);
eData.InnerText = "0";
eRow.AppendChild(eData);

我正在尝试将此 XML 附加到已存在的文件中。我已将文件加载为

XmlDocument xTemp = new XmlDocument();
xTemp.Load(templatePath);

并且DocumentElement.Attributes 中已经有命名空间已经声明了我要使用的前缀:&lt;Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"&gt;。本质上,我试图让“ss”前缀出现在“类型”之前,就像我上面提供的目标一样。此外,输出将xmlns="" 显示为“行”标签中的一个属性,这是我从未添加过的。我认为这两个问题都与未声明命名空间有关,但如上所述,它应该已经在我加载的原始文档中声明。

如何生成我想要的目标 XML 代码?

【问题讨论】:

  • 使用is之前需要定义ss。
  • 我编辑了问题以添加一些必要的说明。简而言之,我已经加载了一个应该定义这些命名空间的文档,但是当我将属性添加到元素时,它没有正确显示。不幸的是,链接的问题并没有那种信息。

标签: c# xml


【解决方案1】:

您创建了属性 xAt 而不指定命名空间 uri,这相当于空字符串命名空间 uri(请参阅 the corresponding MSDN doc here),这当然是您得到 &lt;Row xmlns=""&gt; 的原因

实际上,您需要指定确切的命名空间 uri 才能使其按预期工作。 让我使用您在问题中给出的命名空间 uri 进行说明(说明与您的初始代码非常相似,但可能有一些您可以轻松修改的小差异)。

String namespaceUri = "urn:schemas-microsoft-com:office:spreadsheet";
XmlDocument xDoc = new XmlDocument();

XmlElement workbook = xDoc.CreateElement("ss", "Workbook", namespaceUri);
XmlElement rows = xDoc.CreateElement("Rows");

在此步骤中,我可以假设我有一个类似于最初加载文件后的 XmlDocument。我的 XmlDocument 将 workbook 节点作为其 DocumentElement,它使用给定的前缀和命名空间 uri。

现在我们可以创建属性了:

var attribute = xDoc.CreateAttribute("ss", "Type", "urn:schemas-microsoft-com:office:spreadsheet");
attribute.Value = "String";

命名空间 uri 应正确指定,否则将无法正确呈现。使用该属性时,由于它所引用的命名空间是在嵌套元素(工作簿)上找到的,所以这里不再赘述,框架会自动移除对命名空间uri的引用。

现在我们可以继续创建 Row 和 data 元素,并将属性添加到 Data 元素的属性集合中。

XmlElement eRow = xDoc.CreateElement("Row");
XmlElement eData = xDoc.CreateElement("Data");

eData.Attributes.Append(attribute);
eData.InnerText = "value";
eRow.AppendChild(eData);

rows.AppendChild(eRow);
workbook.AppendChild(rows);

xDoc.AppendChild(workbook);

然后我们可以显示文档,例如:

Console.WriteLine(xDoc.OuterXml);

结果:

<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"><Rows><Row><Data ss:Type="String">value</Data></Row></Rows></ss:Workbook>

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 2017-03-14
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2012-10-14
    相关资源
    最近更新 更多