使用.net2.0计算元素和读取属性?

时间:2011-03-02 04:51:20

标签: c# xml .net-2.0

我有一个.net 2.0的应用程序,我有一些困难,因为我更习惯linq。

xml文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<updates>
    <files>
        <file url="files/filename.ext" checksum="06B9EEA618EEFF53D0E9B97C33C4D3DE3492E086" folder="bin" system="0" size="40448" />
        <file url="files/filename.ext" checksum="CA8078D1FDCBD589D3769D293014154B8854D6A9" folder="" system="0" size="216" />
        <file url="files/filename.ext" checksum="CA8078D1FDCBD589D3769D293014154B8854D6A9" folder="" system="0" size="216" />
    </files>
</updates>

文件下载并即时呈现:

XmlDocument readXML = new XmlDocument();
readXML.LoadXml(xmlData);

最初我认为它会用这样的东西:

XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("//files");

foreach (XmlNode node in nodes)
{
 ... im reading it ...
}

但是在阅读它们之前,我需要知道它们在我的进度条上使用了多少,而且在这种情况下我也对如何获取文件元素的属性一无所知。

  • 我怎么能算出多少“文件” 我有的元素(在进入foreach ofc之前计算它们)并阅读它们 属性?

我需要计数,因为它将用于更新进度条。

总的来说,它不是很好地阅读我的xml。

3 个答案:

答案 0 :(得分:2)

  

在阅读之前我需要知道他们在进度条上使用了多少

使用XmlNodeList.Count属性。下面的代码示例。

  

总的来说,它不是很好地阅读我的xml

以下是使用较旧的Xml库读取Xml的一些提示。

首先,XPath是你的朋友。它可以让你以一种非常模糊地与Linq相似的方式快速查询元素。在这种情况下,您应该更改XPath以获取子“文件”元素的列表,而不是父“files”元素。

XmlNodeList nodes = root.SelectNodes("//files");

变为

XmlNodeList files = root.SelectNodes("//file");

//ElementName以递归方式搜索具有该名称的所有元素。 XPath非常酷,你应该读一下。以下是一些链接:

拥有这些元素后,您可以使用XmlElement.Attributes属性以及XmlAttribute.Value属性(file.Attributes["url"].Value)。

或者您可以使用GetAttribute方法。

Click this link to the documentation on XmlElement了解更多信息。请记住在该页面上将.Net Framework版本切换为2.0。

XmlElement root = doc.DocumentElement;
XmlNodeList files = root.SelectNodes("//file"); // file element, not files element

int numberOfFiles = files.Count;
// Todo: Update progress bar here

foreach (XmlElement file in files) // These are elements, so this cast is safe-ish
{
    string url = file.GetAttribute("url");
    string folder = file.GetAttribute("folder");

    // If not an integer, will throw.  Could use int.TryParse instead
    int system = int.Parse(file.GetAttribute("system"));
    int size = int.Parse(file.GetAttribute("size"));

    // convert this to a byte array later
    string checksum = file.GetAttribute("checksum");
}

关于如何将校验和转换为字节数组,请参阅以下问题:

How can I convert a hex string to a byte array?

答案 1 :(得分:0)

编辑:

您应该可以使用nodes[0].ChildNodes.Count;

答案 2 :(得分:0)

您可以通过获取收藏的长度来计算多个元素:

int ElementsCount = nodes.Count;

您可以按以下方式阅读属性:

foreach(XmlNode node in nodes) {
    Console.WriteLine("Value: " + node.Attributes["name_of_attribute"].Value;
}