控制XElement属性命名空间名称

时间:2013-06-04 17:06:16

标签: linq-to-xml xelement xattribute xnamespace

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

我遍历导出列表中的每个项目,生成它的内部XElement对象(基于我们的规则),并将.ToString()表示保存到数据库。在生成所有内部片段之后,将它们从db中拉出,解析回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项会直接解析命名空间。

所以我的问题是:有没有办法控制解析告诉它不使用Expanded名称p1而是使用外部XElement的命名空间? OR 那里有什么内容可以查看扩展名称并看到它与root相同并因此将其删除?

1 个答案:

答案 0 :(得分:0)

我们最终要做的就是在执行.ToString()并将它们保存到数据库之前,在每个结果周围添加一个“外部”XElement(声明了相应的命名空间)。然后,当我们将项目的xml结果从数据库中拉出并将其解析回XElement时,我们会查看该XElement的.Elements()属性并将其拉入我们较大的“最终”XElement对象而不是解析的XElement本身。 / p>

相关问题