【发布时间】:2017-06-28 08:00:20
【问题描述】:
我有以下 XML 文件:
<myXML>
<MyGroup>
<source>OCU</source>
<endianity>
<set>LITTLE</set><!--LITTLE/BIG Endian-->
</endianity>
<msgNumber>
<Number>5</Number>
<Field>
<name>Pos_X</name>
<entry>
<ByteOffset>
<offset>8</offset>
</ByteOffset>
<ByteSize>
<Size>4</Size>
</ByteSize>
</entry>
</Field>
<Field>
<name>Pos_Y</name>
<entry>
<ByteOffset>
<offset>12</offset>
</ByteOffset>
<ByteSize>
<Size>4</Size>
</ByteSize>
</entry>
</Field>
</msgNumber>
</MyGroup>
</myXML>
我使用 XmlSerializer 将它解析为一个对象,并且它起作用了。 唯一的问题是我必须创建一个与该对象匹配的类。 我的意思是这样的:
xmlInputData = File.ReadAllText(newPath + xmlFileName);
myXML messages = Deserialize<myXML>(xmlInputData);
我现在想要不创建一个类 - 这意味着将 XML 直接解析为字典 - 类似于以下内容:
Dictionary<MessageNumber, SecondDictionary>
|
|
SecondDictionary<FieldName, FieldValue>
如何使用 嵌套 字典对其进行解析?如何与 XML 保持相同的层次结构?
编辑:
我尝试在 LINQ 中编写它,但它对我来说太复杂了:
var doc = XDocument.Load(newPath + xmlFileName);
var rootNodes = doc.Root.Descendants("msgNumber");
var keyValuePairs = from n in rootNodes
select new
{
TagName = n.Name,
TagValue = n.Value
};
Dictionary<string, string> allItems = new Dictionary<string, string>();
foreach (var token in keyValuePairs)
{
allItems.Add(token.TagName.ToString(), token.TagValue.ToString());
}
如何使用 LINQ 获得所需的层次结构? 我想要完成的主要事情是: 为每条消息获取它的字段。
例如,对于 5 号消息,我想保存 所有字段(保留层次结构)。这意味着 name 和 entry(字节偏移量和字节大小)。
【问题讨论】:
-
为什么不直接使用 LINQ to XML?它允许你以任何你想要的方式查询 XML。嵌套字典听起来像一场噩梦。
-
我更新了帖子。请看一下(:
-
对于像
<Field/>这样的重复元素,您希望发生什么并不清楚。第一个标记的副本确实包含涉及该问题的答案。其他副本提供了替代方法。
标签: c# xml parsing dictionary