0

我正在构建一个导出引擎,它将获取我们公司的数据并根据我们数据库中提供的模式将其导出为 XML。当元素的值为 null 时,我需要实现的导出之一必须将xsi:nil="true"属性添加到元素中。

我遍历导出列表中的每个项目,生成它的内部 XElement 对象(基于我们的规则),并将 .ToString() 表示形式保存到数据库中。生成所有内部片段后,它们会从数据库中提取,解析回 XElement 对象,然后添加到外部 xml 根。(将其全部保存在数据库中允许暂停导出、服务器重启后恢复导出等)

我已经在外部根中指定了 xsi 命名空间,但是在添加(解析的)内部 XElement 时这不起作用。

这是我的代码当前如何工作的表示:

//Generate inner xml
XElement innerElement = new XElement("inner");
XNamespace xsi = @"http://www.w3.org/2001/XMLSchema-instance";
XAttribute attrib = new XAttribute(xsi + "nil", "true");
innerElement.Add(attrib);

//Mock out saving XElement as string
string innerString = innerElement.ToString();
XElement innerElementParsed = XElement.Parse(innerString);

//Add innerxml to outer xml root
XNamespace outerXsi = "http://www.w3.org/2001/XMLSchema-instance";
XAttribute outerAttrib = new XAttribute(XNamespace.Xmlns + "xsi", outerXsi);
XElement outerElement = new XElement("Outer", outerAttrib);
outerElement.Add(innerElementParsed);
return outerElement.ToString();

我得到以下结果

<Outer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <inner p1:nil="true" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" />
</Outer>

我无法弄清楚如何让它不使用扩展名称(在本页底部:http: //msdn.microsoft.com/en-us/library/system.xml.linq.xnamespace.aspx

如果我能够删除将其保存到中间数据库的“.ToString()”步骤,我就不会有这个问题,因为添加所有 XElement 项可以正确地解析命名空间。

所以我的问题是:有没有办法控制解析告诉它不使用扩展名称 p1 而是使用外部 XElement 的命名空间? 或者 是否有一些东西可以查看扩展名称并看到它与根相同并因此删除它?

4

1 回答 1

0

我们最终解决这个问题的方法是在执行 .ToString() 并将它们保存到数据库之前,在每个结果周围添加一个“外部”XElement(声明了适当的命名空间)。稍后,当我们从数据库中提取项目的 xml 结果并将其解析回 XElement 时,我们查看该 XElement 的 .Elements() 属性并将其拉入我们更大的“最终”XElement 对象,而不是解析后的 XElement 本身。

于 2013-06-07T13:13:42.277 回答