XML结构化数据的分析

本文关键字:数据 结构化 XML | 更新日期: 2023-09-27 18:02:33

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

我最好的方法是什么?

XML示例:

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

我一直在尝试编写可以用来查询文件的软件,但一直没有能够想出任何有用的东西。

谢谢。

编辑:在c#方面,我想(虽然我确信这是不可能的)是一个字典,有一个字符串作为关键和相应的值可以是字符串或另一个字典。

XML结构化数据的分析

是这样的↓?

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();
    }

如果文件不是太大,我建议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}++;
    }
}

所以根据你想要收集的数据调整结构

对于解析XML,我更喜欢使用普通的XmlReader。诚然,它更啰嗦,但它超级高效和透明,至少对我来说是这样。例如:

<>之前使用(var xr = XmlReader)创建('您的流'))而(xr.Read ())如果(xr。NodeType == XmlNodeType.Element)开关(xr.Name) {例"品牌"://对这个元素做点什么;//可能会读取整个子树…使用(var xrr = xr.ReadSubtree())而(xrr.Read ()) {//在这里工作…}打破;例"产品"://这是另一个元素打破;例"某些元素"://等等打破;}//switch