XML结构化数据分析

时间:2011-07-13 03:50:27

标签: c# xml

我的工作使用软件填写表示为XML文档的记录。我的任务是浏览这些XML文件以从中提取统计信息。文件本身不遵循任何模式,如果表单字段没有填写,则不会创建与该字段对应的XML。

我最好的方法是什么?

示例XML:

<Form>
    <Field>
        <id>Field ID</id>
        <value>Entered Value</value>
    </Field>
</Form>

我一直在尝试编写可用于查询文件的软件,但却无法提供任何远程有用的软件。

任何想法都赞赏。

编辑:就C#而言,我想要的是(虽然我确定它不可能)是一个以字符串为键的字典,相应的值可以是字符串或其他字典。 / p>

3 个答案:

答案 0 :(得分:1)

如果文件不是太大,我会建议perlXML::Simple模块。这会将XML映射到perl的哈希数组,然后你可以像平常一样循环遍历它。类似的东西:

my $xml = XML::Simple::XmlIn( 'file.xml', force_array => [ 'Form', 'Field' ] );
my %fld_counts;
foreach my $form ( @{$xml->{Form}} )
{
    # Any start record processing...
    foreach my $fld ( @{$form->{Field}} )
    {
        my $id = $fld->{id}
        my $val = $fld->{value}
        # Do something with id/value... like...
        $fld_counts{$id}++;
    }
}

因此,只需根据您要收集的统计数据调整该结构

答案 1 :(得分:1)

是这样的↓?

XML:

<?xml version="1.0" encoding="utf-8" ?>
<Form>
 <Field>
  <id>People1</id>
  <value>C Sharp</value>
 </Field>
 <Field>
  <id>People2</id>
  <value>C Sharp</value>
 </Field>
 <Field>
   <id>People3</id>
   <value>C</value>
 </Field>

来源:

static void Main(string[] args)
    {
        var doc = XDocument.Load("test.xml");
        var result = from p in doc.Descendants("Form").Descendants("Field")
                     select new { ID = p.Element("id").Value, VALUE = p.Element("value").Value };

        foreach (var x in result)
            Console.WriteLine(x);

        var gr = from p in result
                 group p by p.VALUE into g
                 select new { Language=g.Key , Count=g.Count() };


        foreach (var x in gr)
            Console.WriteLine(string.Format("Language:{0} Count:{1}" , x.Language , x.Count));

        Console.Read();
    }

答案 2 :(得分:0)

对于解析XML,我更喜欢使用普通的XmlReader。当然,它更冗长,但它是超级高效和透明的,至少对我而言。例如:

using(var xr = XmlReader.Create('your stream here'))
    while(xr.Read())
        if(xr.NodeType == XmlNodeType.Element)
            switch(xr.Name) {
                case "brands":
                    // do something here with this element,
                    // like possibly reading the whole subtree...
                    using(var xrr = xr.ReadSubtree())
                        while(xrr.Read()) {
                            // working here...
                        }
                    break;
                case "products":
                    // that is another element
                    break;
                case "some-other-element":
                    // and so on
                    break;
            } // switch