【问题标题】:Is it possible to build an XML recursively without using any LINQ queries?是否可以在不使用任何 LINQ 查询的情况下递归地构建 XML?
【发布时间】:2012-12-16 03:31:13
【问题描述】:
  1. 我之前问过一个问题,可以找到here, 我想知道接受答案的代码是否可以在正常编程中完成没有Linq查询,任何示例都将不胜感激。
    请注意,这是我开始实施它的方式,并且在实施过程中遇到了一些问题。

  2. 我已经设法通过反射获得私有字段值而不使用属性,这有问题吗?我是否应该始终通过反射中的属性获取值?

代码:

public static class Extensions
{
    public static XElement ToXml<T>(this T obj)
    {
        Type type = typeof(T);

        return new XElement("Class",
                    new XElement(type.Name,
                        from pi in type.GetProperties()
                        where !pi.GetIndexParameters().Any()
                        let value = (dynamic)pi.GetValue(obj, null)
                        select pi.PropertyType.IsPrimitive || 
                               pi.PropertyType == typeof(string) ?
                                new XElement(pi.Name, value) : 
                                Extensions.ToXml(value)
                        )
                    );
    }
}

提前致谢

【问题讨论】:

  • 您在实施过程中遇到了哪些问题?您有不同的机会来构建 xml - XmlWriter、XmlDocument,但是 LINQ 有什么问题?
  • @lazyberezovsky 也许他需要早期版本的 .NET 框架 - linq 只是来自版本 3(3.5?)
  • @elyashiv 好吧,那么奇怪他为什么在上一个问题中询问XElement 的用法。我觉得应该还有问题
  • 我真的很喜欢你的回答,我想我已经完全理解它了,但只是为了一般知识,我想知道我是否可以按照我的方式去做。在我的实现中,没有 XmlWriter 仅使用 XElements 来构建嵌套的分层 xml。所以我猜答案是基于某种方式使用 Xml 编写器,除了使用 XElement 的 c'tor 之外?
  • @JavaSa 如果您使用的是System.Xml.Linq.XElement,那么您已经在使用 Linq。我觉得this tutorial对你很有帮助

标签: c# xml linq reflection linq-to-xml


【解决方案1】:

如果您不想使用 LINQ:

public static class Extensions
{
    public static void ToXml<T>(this T obj, XmlWriter writer)
    {
        Type type = typeof(T);
        writer.WriteStartElement("Class");
        writer.WriteStartElement(type.Name);

        foreach (PropertyInfo pi in type.GetProperties())
        {
            if (pi.GetIndexParameters().Length > 0)
                continue;

            var value = pi.GetValue(obj, null);            

            if (pi.PropertyType.IsPrimitive ||
                pi.PropertyType == typeof(string))
            {
                writer.WriteElementString(pi.Name, 
                                   (value == null) ? "" : value.ToString());
                continue;
            }

            if (value == null)
                continue;

            Extensions.ToXml((dynamic)value, writer);
        }

        writer.WriteEndElement();
        writer.WriteEndElement();
    }   
}

用法:

StringBuilder sb = new StringBuilder();
using(var writer = XmlWriter.Create(sb))
    worker.ToXml(writer);

string xml = sb.ToString();

【讨论】:

  • @JavaSa 没问题,但几乎没有更新 - 我添加了空值处理(例如,如果地址或名称为空)。
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2010-10-20
相关资源
最近更新 更多