格式化XElement值

时间:2012-06-19 11:41:14

标签: c# linq-to-xml

有什么办法可以控制这个陈述的格式吗?

var element = new XElement("Element", true);

这样我就可以得到这个输出,例如:

<Element>True</Element>

我正在寻找一个可插拔的格式化程序,而不是true ? "True": "False"

我之后尝试过遍历元素,但似乎XElement的构造函数在值上调用ToString(),这意味着我很难评估类型。

1 个答案:

答案 0 :(得分:1)

完全改回答案:

以前我推荐过XmlWriter,但事实证明这是不可能的。

我正在编辑这个答案,因为XElement没有像我想象的那样保留类型,即在

var x = new XElement("element", true);
x.WriteTo(new XmlTextWriter(Console.Out)); // Write stuff to console using XmlTextWriter
永远不会调用

WriteValue(Boolean),该值会在XText中存储为XElement

对于那些感兴趣的人,XElement.WriteTo调用XmlWriter.WriteElement(一个扩展方法),后者又调用XmlWriter.WriteString。

可以更改XmlWriter.WriteString的行为,但这也会改变

的输出
var x = new XElement("element", "true"); // String instead of bool

因为没有存储类型。

我的解决方案是创建一个工厂,并通过它控制XElements的创建方式。 IE:

class XElementFactory {
      public static XElement CreateXElement(string name, object value) {
          var type = obj.GetType();
          if (typeof(boolean).Equals(type))
             // Format the XText accordig to specification, use the XText ctor for clarification and readability
             return new XElement(name, (bool) obj ? new XText("True") : XText("False")); 
          // Maybe add additional if clauses if there are just a few special cases
          return new XElement(name, obj); // Let it through
      }
}

反射严重损害了性能,但是由于我们处理XML,我的猜测是性能开始并不重要。如果需要,使用构建器模式,其中根据类型调用正确的构建器,即:

Builders.First(b => b.Types.Contains(objToBuild.GetType())).BuildXElement(objToBuild); // Builders could maybe be filled by MEF?

这个答案有点长(但我在长时间的电话会议中做了一些事情= P),实质上问题不是格式问题而是创作问题。