Создание случайных записей XML на Java или Perl - PullRequest
1 голос
/ 18 февраля 2010

Я ищу метод для вставки случайных данных XML в Java (или Perl).

<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 случайной серией символов. Остальные данные могут остаться без изменений.

Мне нужна помощь только со вставкой, а не с созданием струн (спасибо Синан Юнюр!)

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 18 февраля 2010

Итак, в основном, ваш вопрос как я могу сгенерировать случайную строку из восьми символов, состоящую из цифр и заглавных букв? :

#!/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 ];
    }
}
2 голосов
/ 18 февраля 2010

Хотя в шаблонном решении нет ничего неправильного , я хочу показать, что не обязательно сложно делать это «правильным» способом XML-слинга, может сэкономить вам много времени позже, если ваши требования когда-либо изменятся.

Тем не менее, вот эскиз того, как вы могли бы построить это с помощью XML :: Twig. Любые углы, которые я вырезал, строго соответствуют названию хорошего примера фрагмента, который помещается на одном экране:)

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;
1 голос
/ 18 февраля 2010

Для этого в Java вы можете использовать DOM: это добавит значение атрибута в файл xml (xmlInput), для которого не установлен атрибут ID

        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 (), но эта часть должна быть легкой

1 голос
/ 18 февраля 2010

Как бы мне ни было больно решать проблему XML с использованием регулярных выражений, в этом случае мы, вероятно, можем сделать исключение:

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

генератор случайных строк можно найти, прибегая к помощи «случайной строки perl», например: http://guymal.com/mycode/generate_random_string/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...