使用递归字典存储xml的缺点是什么?
本文关键字:缺点 是什么 xml 存储 递归 字典 | 更新日期: 2023-09-27 18:15:28
我将xml文件加载到递归字典中,以便我可以通过以下方式访问xml文件: Example.xml:
<objects>
<object>
<id>256</id>
<objectType>Person</objectType>
<name>Bob</name>
<object>
<id>128</id>
<objectType>BodyType</objectType>
<shape>Athletic</shape>
</object>
<object>
<id>1024</id>
<objectType>Body-Measurements</objectType>
<height>5'9"</height>
<weight>155</weight>
</object>
</object>
<object>
<id>512</id>
<objectType>T-Shirt</objectType>
<object>
<id>64</id>
<objectType>Logo</objectType>
<design>Dragon-Tatoo</design>
<object>
<id>64</id>
<objectType>Design-Color</objectType>
<color>black</color>
</object>
</object>
</object>
使用递归字典的c#示例代码:
RecursiveDictionary RE = loadXML("Example.xml");
Console.WriteLine( ToInt(RE["objects"]["0"]["object"]["id"]) . "'n" );
Console.WriteLine( RE["objects"]["0"]["object"]["0"]["object"]["1"]["height"] . "'n" );
Console.WriteLine( ToConsoleColor(RE["objects"]["1"]["object"]["0"]["object"]["0"]["object"]["color"]).ToString() . "'n" );
示例输出:
128
5'9"
black
ToConsoleColor()
不需要打印出字符串"黑色",但在我的实际应用程序中,我会进行转换,然后将控制台颜色设置为ToConsoleColor()
返回的enum值。在本例中,我只是打印ToString()来显示我在递归字典中拉入XML的效果,然后访问XML文件的细节并将它们转换为有用的程序数据类型(在本例中是控制台枚举值)。
在尝试转换任何东西之前,我有检查键/值或标记/值是否存在的代码,并将打印错误,让我知道我没有处理特定的xml标记以及出于什么原因。无论错误xml与否,代码都尽可能地运行。
我想知道这样做的缺点是什么,而不是使用X-Paths。
这种方法可能没有什么固有的错误(尽管有一些陷阱(见下文)),但我的主要问题是为什么要?
这是一个常见的问题,很多比我们聪明的人都遇到过,并想出了解决方案;为什么不使用他们经过实战考验的解决方案呢?
不这样做的几个原因
- 你不能查询你的数据
- 此数据更适合JSON而不是XML,但是忽略这一点—当您希望基于属性(或者实际上,元素名称以外的其他内容)进行查询时会发生什么
- 你失去了强类型属性的好处
- 看起来你只是在制作子字典,其键是集合中的索引…这比使用
XPathNavigator
和迭代选定节点的子节点更容易吗?
- 看起来你只是在制作子字典,其键是集合中的索引…这比使用
作为一个初级程序员,我肯定看到写这样的东西来获得经验的价值,但这不属于prod代码——有太多潜在的问题,没有足够的实际功能。
我将根据我作为程序员的经验给你一些建议:在很长一段时间里,你会想要重新发明轮子,因为你可以…这是很好的学习东西(我被困在这里一段时间)。只是要确保当你真的在搭帐篷的时候,不要欺骗自己,以为你在建造摩天大楼(不是说这就是这里发生的事情;
您的数据结构不能处理混合内容,也不能保留元素的顺序。这使得它适合于某些XML文档(粗略地说,就是那些同样可以用JSON处理的文档),而完全不适合于其他文档。
XPath很可能比递归字典慢(因为表达式需要编译)。
但是,我建议使用Linq to XML。代码已经编写并调试过,并且具有类似的访问模式。参见如何从XDocument
我能想到的缺点是:
- 在我看来,这真的是不可读的多个
[..]
一个接一个。您可以很容易地失去跟踪,特别是当项目/xml变大时。 - 创建这样的字典可能会消耗大量内存。因此,如果不将整个xml加载到这样的结构中,可能会节省一些空间。也许
using
的使用有助于减少这个问题。
两种方法都可以。决定什么最适合自己。