C#使用递归字典存储xml有什么缺点

标签 c# xml dictionary recursion

我将 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() 不需要打印字符串 'black' 但在我的真实应用程序中我会进行转换,然后将控制台颜色设置为 的枚举值ToConsoleColor() 返回。在这种情况下,我只是打印 ToString() 来显示我想要的效果,即在递归字典中提取 XML,然后访问 xml 文件的详细信息并将它们转换为有用的程序数据类型(在此case 控制台枚举值)。

我有代码在尝试转换任何内容之前检查键/值或标签/值是否存在,并打印出错误让我知道我没有处理特定的 xml 标签以及原因。无论是否有错误 xml,代码都会尽可能地运行。

我想知道与使用 X-Paths 相比,这样做的缺点是什么。

最佳答案

这种方法可能没有内在的错误(尽管存在一些缺陷(见下文)),但我的主要问题是为什么

这是一个常见问题,很多比我们聪明的人都遇到过并提出了解决方案;为什么不使用他们经过实战检验的解决方案?

您不想这样做的几个原因:

  1. 您不能查询您的数据
    • 此数据更适合 JSON 而不是 XML,但请忽略这一点——当您想基于属性(或者实际上,元素名称以外的其他内容)进行查询时会发生什么
  2. 你失去了强类型属性的好处
    • 看起来您只是在制作子字典,其键是集合中的索引...这比使用 XPathNavigator 并遍历选定节点的子节点更容易吗?

作为初级程序员,我确实看到了编写这样的东西以获得经验的值(value),但这不属于产品代码——存在太多潜在问题而实际功能不足。

我将根据我作为程序员的经验给你一些建议:在很长一段时间内,你会想要重新发明轮子,因为你可以......学习东西很好(我被困在这里一段时间)。当你真的在搭帐篷时,一定不要自欺欺人地认为你在 build 摩天大楼(并不是说这就是这里发生的事情;只是一般性建议)。

关于C#使用递归字典存储xml有什么缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32876649/

相关文章:

python - 将字典值添加到列表中,这是字典的值

c# - SignalR 在最终代理调用时失败

c# - 如何判断 Stream 何时结束?

javascript - SimplyJS 和 xml : get value of a key

java - 基于 XML 输入的动态 XML 响应

xml - 从返回的 XQuery 中删除重复项

swift - 将数据保存到数组中[Swift]

c# - 无法将 Dictionary List<string> 类型参数隐式转换为 ICollection<string>

c# - 列表<类>() 与列表<类>(0)

c# - 使用c#压缩动画gif图像大小