Vinnaren i pepparkakshustävlingen!
2005-11-19, 21:08
  #1
Medlem
Hej!
jag har har ett par 100 xml filer som jag har tänkt att dola lite med.
dom ser ungefär ut så här:
Kod:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<FileListing Version="1" CID="4V4V7WSF4AAWC" Base="/" Generator="*">
	<Directory Name="*">
		<Directory Name="*">
			<Directory Name="*">
				<File Name="*" Size="*" TTH="*"/> 
                        </Directory>
		</Directory>
	</Directory>
</FileListing>
fast mycket längre. Det jag har tänkt att göra är att sammla alla <Directory Name="*"> på ett ställe. Sen om det finns flera dir.name så ska dom adderas så det syns hur många det finns eller läggas under varandra.
Vitsen med det hela är att man ska se vilka dir.namn det finns flest av.

Lite svårt att beskriva men hoppas någon har en lösning på problemet.

/FarmoR
Citera
2005-11-19, 21:41
  #2
Medlem
nudieses avatar
Inte helt på det klara med vad du vill göra, men jag kan rekommendera Xerces om du vill parsa XML i C++, Java eller Perl.

http://xerces.apache.org/
Citera
2007-11-17, 21:01
  #3
Medlem
och nu ser jag att inlägget, som ligger som nummer tretton från toppen är två år gammalt...

Nåja, perl/xml för de intresserade
Kod:
use strict;
use warnings;

use File::Find;

# http://cpan.uwinnipeg.ca/dist/XML-LibXML (can be installed using PPM)
# http://search.cpan.org/~pajas/XML-LibXML-1.65/
use XML::LibXML;

# Clear command window
system('cls');

# Hash reference, for storing directory paths and number of occurences 
my $directories;

# Root folder containing xml files
my $root_folder = 'C:\test';

# Get all xml files
my $xml_files   = get_xml_files($root_folder);

# Create XMl parser 
my $parser = XML::LibXML->new();

# For each xml file
for (@{$xml_files}) {
    my $doc   = $parser->parse_file($_);
    my $root  = $doc->documentElement();
    
    # Fecth all <Directory> nodes 
    my @nodes = $root->getElementsByTagName('Directory');
    
    # For each node, get Name attribute's value and store in global hash
    for my $node (@nodes) {
        $directories->{$node->getAttribute('Name')}++;
    }
}

# Print result
print "Found " . (scalar @{$xml_files}) . " files in root $root_folder\nHits\tDirectory path\n";

for (keys %{$directories}){
    print $directories->{$_} . "\t" . $_ . "\n";
} 

#-------------------------------------------------------------------------------
# Functions
#-------------------------------------------------------------------------------

sub get_xml_files {
    my $root_folder = shift;
    my @xml_files;
    
    # Call back fo File::Find::find
    my $cb = sub  {
        return if -d;
        push @xml_files, $File::Find::name if /\.xml$/i; 
    };
    
    find($cb, $root_folder);
    return \@xml_files;
}

Kört på ett par exempel filer, skriver det ut

Found 3 files in root C:\test
Hits Directory path
6 some folder
6 some other folder
6 *
Citera
2007-11-17, 23:02
  #4
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av schumi
och nu ser jag att inlägget, som ligger som nummer tretton från toppen är två år gammalt...
Ja, xml-forumet är populärt, värsta draget här på kvällarna
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback