tags:

views:

75

answers:

4

Hello

I am looking for a method to insert random XML data in Java (or 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>

In the above example, I would need to make the ID attribute a random series of characters. The rest of the data can remain the same.

It is only the insertion that I need help with, not creating the strings (thanks Sinan Ünür!)

Thanks in advance.

+4  A: 

So, basically, your question is how can I generate an eight character random string consisting of digits and capital letters?:

#!/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 ];
    }
}
Sinan Ünür
Although I had figured that out, I like yours a lot better than the one I pieced together. I'll clarify the question to illustrate that it's just the inserting that I need help with.
ryantmer
LOL beat me to it Sinan... good solution. +1
DVK
@ryantmer I saw your comments after I posted my answer. Updated my answer.
Sinan Ünür
That's perfect! Thanks a lot :)
ryantmer
lol, well done +1
Maxwell Troy Milton King
@ryantmer You are welcome. Thanks for accepting my answer.
Sinan Ünür
A: 

Much as it pains me to solve XML problem using regular expressions, in this case we can probably make an exception:

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

a random string generator can be found by googling "perl random string", for example this: http://guymal.com/mycode/generate_random_string/

DVK
+1  A: 

To do this in Java you can use DOM: This will add the attribute value to an xml file (xmlInput) which doesn't have the ID attribute set

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

I left out the implementation for createRandomString() but that part should be easy

royalsampler
Thanks. I'm not sure what the specs are for this project, so I've done it in Perl for now. However, if it needs to be done in Java, this will be useful! :)
ryantmer
+2  A: 

Although there's nothing wrong with the templating solution, I want to show that it's not necessarily hard to do it in a "proper" XML-slinging kind of way, and it might save you a lot of time later on if your requirements ever change.

That said, here's a sketch of how you might build this up with XML::Twig. Any corners that I've cut are strictly in the name of producing a nice example snippet that fits on one screen :)

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;
hobbs