1

我想从具有嵌套对象的对象创建一个包含嵌套元素的 xml 文档,但 xml 文件太扁平了。我怎样才能让它迭代对象中的对象以在元素中创建元素。

public object traverse(object pc, string xpath, XmlDocument xmldoc)
{
    IEnumerable enumerable = pc as IEnumerable;
    if (enumerable != null)
    {
        foreach (object element in enumerable)
        {
            RecurseObject ro = new RecurseObject();
            ro.traverse(elementArray, xpath, xmldoc);
        }
    }
    else
    {                         
        Type arrtype = pc.GetType();
        string elementname = arrtype.Name;
        foreach (var prop in pc.GetType().GetProperties())
        {

            XmlElement xmlfolder = null;
            XmlNode xmlnode3 = null;
            string propname = prop.Name;
            string propvalue = "null";
            if (xmldoc.SelectSingleNode(xpath + "/" + elementname) == null)
            {
                xmlnode3 = xmldoc.SelectSingleNode(xpath);
                xmlfolder = xmldoc.CreateElement(null, elementname, null);
                xmlnode3.AppendChild(xmlfolder);

            }
            if (prop.GetValue(pc, null) != null)
            {
                propvalue = prop.GetValue(pc, null).ToString();
            }

            xmlnode3 = xmldoc.SelectSingleNode(xpath + "/" + elementname);
            xmlfolder = xmldoc.CreateElement(null, propname, null);
            xmlfolder.InnerText = propvalue;
            xmlnode3.AppendChild(xmlfolder);
        }
    }

    return null;
}
4

1 回答 1

1

正如评论中提到的,请注意 .NET 包含将对象图转换为 XML 的功能,而无需编写任何代码来生成 XML。这个过程称为序列化,应该很容易在网上或在 SO 上找到示例。

如果您希望完全控制该过程并希望使用反射,Fasterflect包含将对象图转换为 XML 的代码。这是一个带有帮助器的库,可以使反射更容易和更快。您可以在此源文件中找到 XML 扩展的代码。请注意,引用的实现确实会检测或处理循环引用,而内置的序列化机制会。

至于您自己的解决方案,您似乎没有任何代码来检测属性值本身是对象还是原始值。您还需要为对象属性递归调用 traverse 方法,以便处理整个对象图。

于 2013-05-19T23:01:40.560 回答