在没有linq C#的情况下反序列化结构不良的XML

时间:2012-11-16 17:03:13

标签: c# xml linq serialization

我有一个非常糟糕的外部xml提要,所以我不确定如何直接反序列化。

我不能在我的程序集中使用System.IO.Linq,因此我知道唯一不能使用的解决方案。

此xml的示例是

<body>
    <route>
        <stop tag="Info I need to get"/>
        <stop tag="Info I need to get"/>
        <path>
            <point tag="info I need to get"/>
            <point tag="info I need to get"/>
            <point tag="info I need to get"/>
        </path>
        <path>
            <point tag="info I need to get"/>
        </path>
        <path>
            <point tag="info I need to get"/>
            <point tag="info I need to get"/>
        </path>
    </route>
</body>

如果我能以某种方式将所有路径点解析成数组,我可以轻松地获取标记内的数据。

我在How to parse multiple single xml elements in .Net C#

提到了我所提到的linq解决方案

5 个答案:

答案 0 :(得分:3)

您可以使用 XPath 选择具有tag属性的所有节点

XmlDocument doc = new XmlDocument();
doc.Load("myfile.xml");

foreach (XmlElement node in doc.SelectNodes("//*[@tag]"))
{
    Console.WriteLine(node.Name + ": " + node.GetAttribute("tag"));
}

答案 1 :(得分:2)

您可以使用XmlDocument吗?

您可能需要学习一些XPath以便能够很好地导航它,但这应该可以解决问题。

你也可以做这样简单的事情:

XmlDocument doc = new XmlDocument();
doc.Load("myfile.xml");
foreach(XmlNode node in doc.SelectNodes("point"))
{
    var valueYouWant = node.Attributes["tag"].Value;
    // etc.
} 

答案 2 :(得分:2)

我建议使用数组列表,因为我猜你不知道确切的节点数

ArrayList list = new ArrayList();
XmlDocument doc = new XmlDocument();
doc.Load("sample.xml");
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("point"); // You can also use XPath here
foreach (XmlNode node in nodes)
{
   list.Add(node);
}

答案 3 :(得分:0)

您可以使用XmlSerializer:

以下是一个很好的例子:Simple XmlSerializer example

这将允许您序列化对象以进行存储。

答案 4 :(得分:0)

另一种方法是使用xml阅读器XML Reader MSDN,您只需查找路径类型的元素,并使用类似于Reading Attributes

相关问题