C# 能不能将XML文档序列化为 dynamic 类型?

Rajesh_James 2015-11-13 02:48:13
RT
RT
RT
RT
RT
RT
RT



...全文
462 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rajesh_James 2015-11-14
  • 打赏
  • 举报
回复
对了, 若是要取值的话, 需要在后面加上 .Value
Rajesh_James 2015-11-14
  • 打赏
  • 举报
回复
比如说解下面的一段XML

<Root>
<Node1/>
<Node2/>
<Node3/>
</Root>
现在声明返回的对象为 objDynamic , 这三个节点的值分别就可以这样表示 : objDynamic.Root.Node1 objDynamic.Root.Node2 objDynamic.Root.Node3 如果你不明白的话, 你可以自己拿着跑一遍
Rajesh_James 2015-11-14
  • 打赏
  • 举报
回复
引用 12 楼 wmy_03 的回复:
[quote=引用 11 楼 zhanxueguang 的回复:] 或者直接针对 xml 路径 :
public static dynamic Read(string strXmlPath)
        {
            if (!File.Exists(strXmlPath))
                throw new ArgumentNullException("strXmlPath");

            var xmlDoc = new XmlDocument();
            xmlDoc.Load(strXmlPath);

            var strJsonContent = JsonConvert.SerializeXmlNode(xmlDoc);
            dynamic objDynamic = JsonConvert.DeserializeObject(strJsonContent);

            return objDynamic;
        }
这你还用什么Dynamic啊,类型都固定是string了而且是Json串,你那注释可得好好写,要不别人不懂你这函数要干什么。 我感觉你那个不如这个
stream = File.OpenRead(strXmlPath);
                var xmlSerializer = new XmlSerializer(typeof(object));  //这一步~
                xmlReader = new XmlTextReader(stream);
 
                if (xmlSerializer.CanDeserialize(xmlReader))
                {
                    var obj = xmlSerializer.Deserialize(stream);
                    dynamic objDynamic = obj;
                    return objDynamic;
                }
[/quote] 你还没有理解这段代码的意思
wmy_03 2015-11-13
  • 打赏
  • 举报
回复
引用 11 楼 zhanxueguang 的回复:
或者直接针对 xml 路径 :
public static dynamic Read(string strXmlPath)
        {
            if (!File.Exists(strXmlPath))
                throw new ArgumentNullException("strXmlPath");

            var xmlDoc = new XmlDocument();
            xmlDoc.Load(strXmlPath);

            var strJsonContent = JsonConvert.SerializeXmlNode(xmlDoc);
            dynamic objDynamic = JsonConvert.DeserializeObject(strJsonContent);

            return objDynamic;
        }
这你还用什么Dynamic啊,类型都固定是string了而且是Json串,你那注释可得好好写,要不别人不懂你这函数要干什么。 我感觉你那个不如这个
stream = File.OpenRead(strXmlPath);
                var xmlSerializer = new XmlSerializer(typeof(object));  //这一步~
                xmlReader = new XmlTextReader(stream);
 
                if (xmlSerializer.CanDeserialize(xmlReader))
                {
                    var obj = xmlSerializer.Deserialize(stream);
                    dynamic objDynamic = obj;
                    return objDynamic;
                }
Rajesh_James 2015-11-13
  • 打赏
  • 举报
回复
或者直接针对 xml 路径 :
public static dynamic Read(string strXmlPath)
        {
            if (!File.Exists(strXmlPath))
                throw new ArgumentNullException("strXmlPath");

            var xmlDoc = new XmlDocument();
            xmlDoc.Load(strXmlPath);

            var strJsonContent = JsonConvert.SerializeXmlNode(xmlDoc);
            dynamic objDynamic = JsonConvert.DeserializeObject(strJsonContent);

            return objDynamic;
        }
Rajesh_James 2015-11-13
  • 打赏
  • 举报
回复
有解决方案了
Rajesh_James 2015-11-13
  • 打赏
  • 举报
回复
public static string ReadAsString(string strXmlPath)
        {
            FileStream stream = null;

            try
            {
                if (!File.Exists(strXmlPath))
                    throw new ArgumentNullException("strXmlPath");

                stream = File.OpenRead(strXmlPath);
                var xmlDoc = new XmlDocument();
                xmlDoc.Load(strXmlPath);

                return xmlDoc.InnerXml;
            }
            catch (ArgumentNullException)
            {
                throw;
            }
            catch (Exception)
            {
                //log
            }
            finally
            {
                if (stream != null)
                    stream.Close();
            }
            return null;
        }

        public static dynamic Read(string strXmlContent)
        {
            var xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(strXmlContent);

            var strJsonContent = JsonConvert.SerializeXmlNode(xmlDoc);
            dynamic objDynamic = JsonConvert.DeserializeObject(strJsonContent);

            return objDynamic;
        }
wmy_03 2015-11-13
  • 打赏
  • 举报
回复
引用 5 楼 zhanxueguang 的回复:

public static dynamic Read(string strXmlPath)
        {
            FileStream stream = null;
            XmlTextReader xmlReader = null;

            try
            {
                stream = File.OpenRead(strXmlPath);
                var xmlSerializer = new XmlSerializer(typeof(dynamic));  //这一步~
                xmlReader = new XmlTextReader(stream);

                if (xmlSerializer.CanDeserialize(xmlReader))
                {
                    dynamic objDynamic = xmlSerializer.Deserialize(stream);
                    return objDynamic;
                }
            }
            catch (Exception)
            {
                // log
            }
            finally
            {
                if (xmlReader != null)
                    xmlReader.Close();

                if (stream != null)
                {
                    stream.Flush();
                    stream.Close();
                }
            }
            return null;
        }
 stream = File.OpenRead(strXmlPath);
                var xmlSerializer = new XmlSerializer(typeof(object));  //这一步~
                xmlReader = new XmlTextReader(stream);

                if (xmlSerializer.CanDeserialize(xmlReader))
                {
                    var obj = xmlSerializer.Deserialize(stream);
                    dynamic objDynamic = obj;
                    return objDynamic;
                }
单单通过编译没有意义吧
正怒月神 2015-11-13
  • 打赏
  • 举报
回复
我只能说应该可以。 因为我没遇到过。
Rajesh_James 2015-11-13
  • 打赏
  • 举报
回复
有些必要的文件路径检查没加, 大家就不要吐槽了哈
Rajesh_James 2015-11-13
  • 打赏
  • 举报
回复

public static dynamic Read(string strXmlPath)
        {
            FileStream stream = null;
            XmlTextReader xmlReader = null;

            try
            {
                stream = File.OpenRead(strXmlPath);
                var xmlSerializer = new XmlSerializer(typeof(dynamic));  //这一步~
                xmlReader = new XmlTextReader(stream);

                if (xmlSerializer.CanDeserialize(xmlReader))
                {
                    dynamic objDynamic = xmlSerializer.Deserialize(stream);
                    return objDynamic;
                }
            }
            catch (Exception)
            {
                // log
            }
            finally
            {
                if (xmlReader != null)
                    xmlReader.Close();

                if (stream != null)
                {
                    stream.Flush();
                    stream.Close();
                }
            }
            return null;
        }
Rajesh_James 2015-11-13
  • 打赏
  • 举报
回复
引用 3 楼 wmy_03 的回复:
dynamic和object区别不就是一个运行时检查类型,一个编译时检查类型吗。有什么不行的呢。
编译时出错
wmy_03 2015-11-13
  • 打赏
  • 举报
回复
dynamic和object区别不就是一个运行时检查类型,一个编译时检查类型吗。有什么不行的呢。
  • 打赏
  • 举报
回复
不知道有没有这种dll,就像json的newton
Rajesh_James 2015-11-13
  • 打赏
  • 举报
回复
@娃都会打酱油了 @bdmh @caozhy

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧