【问题标题】:Creating random XML entries in Java or Perl在 Java 或 Perl 中创建随机 XML 条目
【发布时间】:2010-02-17 21:52:34
【问题描述】:

我正在寻找一种在 Java(或 Perl)中插入随机 XML 数据的方法。

<vehicles ID="DJ3RKFF9">
    <vehicle>
        <make>Toyota</make>
        <model>Yaris</model>
        <year>2009</year>
    </vehicle>
    <vehicle>
        <make>Ford</make>
        <model>Taurus</model>
        <year>2008</year>
    </vehicle>
</vehicles>

在上面的示例中,我需要将ID 属性设为随机字符系列。其余数据可以保持不变。

我需要帮助的只是插入,而不是创建字符串(感谢 Sinan Ünür!)

提前致谢。

【问题讨论】:

  • 我认为您需要缩小范围。您是否在生成随机数据或将其插入 XML 时遇到问题?
  • 对不起,第二个。我已经想出了如何创建随机字符串,只是不知道如何插入它们。
  • DOM 实现会生成一个 id 属性,如果您不指定一个,以便每个节点都有一个唯一的 id,也许您可​​以使用它/将您的 ID 属性重命名为 id?

标签: java xml perl


【解决方案1】:

所以,基本上,您的问题是如何生成由数字和大写字母组成的八字符随机字符串?

#!/usr/bin/perl

use strict; use warnings;

my $tmpl = <<EO_XML;
<vehicles ID="%s">
    <vehicle>
        <make>Toyota</make>
        <model>Yaris</model>
        <year>2009</year>
    </vehicle>
    <vehicle>
        <make>Ford</make>
        <model>Taurus</model>
        <year>2008</year>
    </vehicle>
</vehicles>
EO_XML

my $generator = make_id_generator('A' .. 'Z', 0 .. 9);

printf $tmpl, $generator->() for 1 .. 10;

sub make_id_generator {
    my @chars = @_;
    return sub {
        join '', @chars[ map { rand @chars } 1 .. 8 ];
    }
}

【讨论】:

  • 虽然我已经明白了,但我比我拼凑的那个更喜欢你的。我将澄清这个问题以说明我需要帮助的只是插入。
  • @ryantmer 我在发布答案后看到了您的 cmets。更新了我的答案。
  • 太完美了!非常感谢:)
【解决方案2】:

虽然模板解决方案没有任何问题错误,但我想表明,以“正确”的 XML-slinging 方式进行操作并不一定困难,如果您的需求发生变化,它可能会在以后为您节省大量时间。

也就是说,这里有一个关于如何使用 XML::Twig 构建它的草图。我剪掉的任何角落都是为了制作一个适合一个屏幕的漂亮示例 sn-p :)

use strict;
use warnings;
use XML::Twig;

sub gen_id {
  my @chars = ('A'..'Z', '0'..'9');
  join '', @chars[ map { rand @chars } 1 .. 8 ];
}

sub gen_vehicle {
  my $vehicle = XML::Twig::Elt->new('vehicle');
  while (my ($key, $value) = splice @_, 0, 2) {
    XML::Twig::Elt->new($key => $value)
        ->paste(last_child => $vehicle);
  }
  $vehicle;
}

sub gen_vehicles {
  my $vehicles = XML::Twig::Elt->new('vehicles');
  $vehicles->set_att( ID => gen_id() );

  gen_vehicle(make => 'Toyota', model => 'Yaris', year => 2009)
    ->paste(last_child => $vehicles);
  gen_vehicle(make => 'Ford', model => 'Taurus', year => 2008)
    ->paste(last_child => $vehicles);

  $vehicles;
}

XML::Twig->set_pretty_print('indented');
gen_vehicles()->print;

【讨论】:

    【解决方案3】:

    尽管使用正则表达式解决 XML 问题让我很痛苦,但在这种情况下,我们可能会例外:

    $ perl -ipe '{my $string = generate_random_string(); s/<vehicles ID="DJ3RKFF9">/<vehicles ID="$string">/;}' myfile.xml
    

    可以通过谷歌搜索“perl random string”找到随机字符串生成器,例如: http://guymal.com/mycode/generate_random_string/

    【讨论】:

      【解决方案4】:

      要在 Java 中执行此操作,您可以使用 DOM:这会将属性值添加到没有设置 ID 属性的 xml 文件 (xmlInput)

              DocumentBuilderFactory dbFac = DocumentBuilderFactory.newInstance();
              DocumentBuilder docBuilder = dbFac.newDocumentBuilder();
              Document doc = docBuilder.parse("resources/xmlinput.xml");
      
              NodeList vehicles = doc.getElementsByTagName("vehicles");
              NamedNodeMap attributes = vehicles.item(0).getAttributes();
              Node ID = attributes.getNamedItem("ID");
              String randomString = createRandomString();
              ID.setNodeValue(randomString);
      
              XMLSerializer serializer = new XMLSerializer();
               serializer.setOutputCharStream(
                       new java.io.FileWriter("resources/xmloutput.xml")
                       );  
            serializer.serialize(doc);
      

      我省略了 createRandomString() 的实现,但这部分应该很简单

      【讨论】:

      • 谢谢。我不确定这个项目的规格是什么,所以我现在已经在 Perl 中完成了。但是,如果需要在 Java 中完成,这将很有用! :)
      猜你喜欢
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多