Article View: cn.bbs.comp.xml
Article #218���� Perl ������Ա�� XML���� 3 ����ת�أ�
From: <Test/>
Date: Tue, 27 Apr 2010 15:36
Date: Tue, 27 Apr 2010 15:36
399 lines
22838 bytes
22838 bytes
���
�������ȿ��� Rosie �����̵����ƷĿ¼��ҵ������һ���仯���ó����̵�� Lizzie ���̵�ϲ��ˡ����鷢�����ҵ���ƷĿ¼�����˲�ͬ�� XML ��ʽ����ǰ������Rosie ���õĸ�ʽ�� �嵥 1 ��ʾ���� Lizzie �����˲�ͬ�ķ������� �嵥 9 ��ʾ��
�����кܴ�ͬ��
* �ܵ���˵��Rosie ����Ԫ�ر�ʾ�� Lizzie ��ʹ�����Ա�ʾ
* Lizzie �Ŀ���� ��Ԫ����ɣ�Rosie �ĵ��еĶ�Ӧ�ڵ����ݳ����������� �ȵȡ�
* Rosie �����е���Ʒ������� Lizzie û��
* Rosie �����˳��ۼ۸�Lizzie �����˽��
* Lizzie ��Ŀ¼�а��������䣬Rosie ���г��˳������ڣ�'dob'��
* Lizzie �����ÿ����Ʒ��λ�ã��� Rosie û��
* Rosie �ṩ�˹����������������������ߣ��� Lizzie ��û��������
��Ҫ�� Lizzie ��¼������� Rosie ��ŷ��ʽ�ij�������ת����ͳһ�ĸ�ʽ�����Dz�����ô������Ҫ������ת���ɵ�ǰ��ʽ�����ڣ�Ȼ����Ҫ�õ� Perl��������ת���ɱ��� YYYY-MM-DD ��ʽ��
�����о�֮���������һ�� SQL ��淶����ݿ����ϵͳ��DBMS���洢��ݡ�������ݿ��� SQL ����� �嵥 6 ��ʾ��һ�µ�����ǣ�ӳ�䵽 Lizzie �� XML ��ݱ�ʾ��㣬��ӳ�䵽���ԡ����Ǿ��������ֲ�ͬ�� XML �ļ�ת����ͳһ�ĸ�ʽ��ͨ��洢�� SQL ��ݿ⽫��ϲ���Ȼ�����ݿ����ͳһ�Ŀ���ļ� XML �ĵ���
����
�ͱ�ϵ�е�ǰ��������һ�����б����еĴ�����ҪһЩ�µ� Perl ģ�顣UNIX �� Linux �û����Դ� cpan ������Щģ�飬Windows �û���һ��ʹ�� ppm������IJο����� �е����ӣ�����Ҫ��ģ�������
* DBI ���� ��ϵ��ݿ�ӿ�
* XML::LibXSLT ���� ������ʽ�?��
��ʽ��� DOM
���Ǿ���ʹ�� XSLT ��ʽ�?rosie.xsl���� �嵥 2 ��ʾ���� Rosie �Ŀ��Ŀ¼ת���ɹ�����ʽ����Ҫͬʱ���� XML �ĵ����嵥 1 �е�Ŀ¼������ʽ�?Ȼ��ʹ�� XSLT ����µ��ĵ���
�嵥 1. Rosie �Ŀ��Ŀ¼
<pets>
<cat><name>Madness</name>
<dob>1 February 2004</dob><price>150</price></cat>
<dog><name>Maggie</name>
<dob>12 October
2002</dob><price>75</price><owner>Rosie</owner></dog>
<cat><name>Little</name>
<dob>23 June 2006</dob><price>25</price></cat>
</pets>
��ʽ�?ÿ����Ԫ��ת���� Ԫ�أ������µ��������ͣ�ʹ��ԭ����ΪԪ����ı����Ϊ����ֵ����һ�����Ԫ����ת�������ԣ����ݱ������ֵ�����嵥 2 ��ʾ����
�嵥 2. rosie.xsl ��ʽ��
<xsl:stylesheet version="1.0">
<xsl:template match="/pets">
<xsl:element name="stock">
<xsl:for-each select="*">
<xsl:element name="item">
<xsl:attribute name="type">
<xsl:value-of select="name()"/>
</xsl:attribute>
<xsl:for-each select="*">
<xsl:attribute name="{name()}">
<xsl:apply-templates/>
</xsl:attribute>
</xsl:for-each>
<xsl:attribute name="cost">0.00</xsl:attribute>
<xsl:attribute name="location">Rosies</xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:element><
</xsl:template>
</xsl:stylesheet>
����Ҫʹ����ʽ����ӳɱ���λ�����ԣ���Ϊ�����㣬ֻ��Ҫһ�д��룬�������� SAX �����������ɵĻ�������Ҫ������
��Ϊ��Ҫ���ж������ת���������Լ�����һ�ڣ������Խ�ͨ�õĴ������ Perl ģ�� RosieStock.pm �У����嵥 3 ��ʾ����
�嵥 3. RosieStock.pm �����֣�
package RosieStock;
use strict;
use XML::LibXML;
use XML::LibXSLT;
use XML::LibXML::SAX::Generator;
sub new {
my $class = shift;
my $parser = XML::LibXML->new;
my $xslt = XML::LibXSLT->new;
my $style = $parser->parse_file('rosie.xsl');
my $self = {
PARSER => $parser,
STYLESHEET => $xslt->parse_stylesheet($style),
};
bless $self, $class;
}
sub parseAndStyle {
my ($self, $inFile) = @_;
$self->{DOC} = $self->{PARSER}->parse_file($inFile);
$self->{STYLED} = $self->{STYLESHEET}->transform($self->{DOC});
return $self;
}
sub toString {
my ($self) = shift;
$self->{STYLESHEET}->output_string( $self->{STYLED} );
}
���ת��ֻ��Ҫ�嵥 4 ��ʾ������ Perl ���롣��δ����������ļ�����ʽ�?Ӧ����ʽ�?��ʾת������嵥 5�����Ա㿴����չ�����
�嵥 4. part3a.pl
#!/usr/bin/perl -w
use strict;
use DBI;
use RosieStock;
my $fixRosie = RosieStock->new;
print $fixRosie->parseAndStyle('pets.xml')->toString;
���Կ�������ʼ�ĵ��е���Ԫ�����ڶ���������ԡ����Ŀ¼�е�ʵ������û�б䣬ֻ���������˳ɱ���λ�����ԣ����嵥 5 ��ʾ����
�嵥 5. ת����� Rosie ���Ŀ¼��part3a.out��
<?xml version="1.0"?>
<stock>
<item type="cat" name="Madness" dob="1 February 2004" price="150"
cost="0.00" location="Rosies"/>
<item type="dog" name="Maggie" dob="12 October 2002" price="75"
owner="Rosie" cost="0.00" location="Rosies"/>
<item type="cat" name="Little" dob="23 June 2006" price="25"
cost="0.00" location="Rosies"/>
</stock>
SAX �ܵ�
�� 2 ���֣������ �ο����ϣ����ᵽ����Ȼ�������������� XSLT ת�����ܵ� XML �ĵ�������װ���ڴ�ͣ���̶����ȵ����ƣ��� SAX �ܹ����������С�ͳ��ȵ� XML �������һ����������ߵ��ŵ㣺������������ת�� XML �ĵ�����Ȼ�����������Щ������ɹ��� SAX �ܵ����¼�����Ϊ Rosie �Ŀ���ĵ������Ѿ�ת����������ʽ�����ϾͿ���ʵ���������������ǽ���ý�����ת����������ڴ�����ݿ�֮ǰ�����ṩ�� SAX �������
���� DOM ��
�����ĵ�һ�� SAX �ܵ����������֣����� DOM ������� SAX �¼��������������Щ�¼�������д����ݿ�Ĵ������������� RosieStock ���������ӵ�һ�����������嵥 6 ��ʾ�������������Ԥ�ȴ��ڵ���ݿ��е� PETS.STOCK ����д���У��� �嵥 7 ��ʾ������������ SAX �ܵ��� Perl ������ �嵥 8 ��ʾ��
�嵥 6. RosieStock.pm������֣�
sub generate {
my ($self, $handler) = @_;
my $generator
= XML::LibXML::SAX::Generator->new(Handler=>$handler);
$generator->generate( $self->{STYLED} );
}
1;
RosieStock.pm �����ӵ��� XML::LibXML::SAX::Generator������� DOM ������ģ�����Ѿ������Ĺ淶���� XML �ĵ�������� SAX �¼������¼������ݸ������
�嵥 7. Stock2DB.pm
package Stock2DB;
use XML::SAX::Base;
@ISA = ('XML::SAX::Base');
use strict;
use DBI;
use constant TYPE0 => 0;
use constant TYPE1 => 1;
use constant TYPE2 => 2;
sub new {
my $class = shift;
my $self = { COUNTER => 0, HASHTYPE => TYPE0 };
return bless {}, $class;
}
my @months = ( 'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November',
'December');
sub _dobFromAge($) { # precision is not an issue!
my $age = shift;
my $tob = time() - $age * ((86400) * 365.25);
my ($day, $month, $year) = (localtime($tob))[ 3, 4, 5 ];
$year += 1900;
return "$day $months[$month] $year";
}
# see Perl SAX 2.1 spec for details regarding $data (hash ref)
sub _getVal($$) {
my ($hash, $name) = @_;
return (defined $hash->{$name}) ? ''.$hash->{$name} : '';
}
# expect attribute names to appear in hash
sub _getAttrsTYPE1($) {
my $attrs = shift;
return (
_getVal($attrs, 'type'), _getVal($attrs, 'name'),
_getVal($attrs, 'cost'), _getVal($attrs, 'price'),
_getVal($attrs, 'dob'), _getVal($attrs, 'location'),
_getVal($attrs, 'age'),
);
}
# expect prefixed attribute names to key secondary hash
sub _getFromSecondary ($$) {
my ($hash, $name) = @_;
my $value;
my $ref = $hash->{ "{}$name" };
if (defined $ref) {
$value = $ref->{Value};
}
return $value;
}
sub _getAttrsTYPE2($) {
my $attrs = shift;
my ($type, $name, $cost, $price, $dob, $location, $age) = (
_getFromSecondary ($attrs, 'type'),
_getFromSecondary ($attrs, 'name'),
_getFromSecondary ($attrs, 'cost'),
_getFromSecondary ($attrs, 'price'),
_getFromSecondary ($attrs, 'dob'),
_getFromSecondary ($attrs, 'location'),
_getFromSecondary ($attrs, 'age'),
);
return ($type, $name, $cost, $price, $dob, $location, $age);
}
sub start_element {
my ($self, $data) = @_;
my $elmName = $data->{Name};
if ($elmName eq 'item') {
my $attrs = $data->{Attributes};
my $hashType = $self->{HASHTYPE};
$hashType = TYPE0 if !defined($hashType);
if ($hashType == TYPE0) {
my @keyList = keys %$attrs;
my $attr0 = $keyList[0];
if ($attr0 =~ /^{}/) {
$hashType = TYPE2;
} else {
$hashType = TYPE1;
}
$self->{HASHTYPE} = $hashType;
$self->{COUNTER} = 0;
}
my ($type, $name, $cost, $price, $dob, $location, $age);
if ($hashType == TYPE1) {
($type, $name, $cost, $price, $dob, $location, $age) =
_getAttrsTYPE1( $attrs );
} else {
($type, $name, $cost, $price, $dob, $location, $age) =
_getAttrsTYPE2( $attrs );
}
# do any necessary fixups
if (!defined($name) or $name eq '') {
$name = "$type-" . $self->{COUNTER}++;
}
if (!defined($cost) or $cost eq '' or ($cost eq '0.00') ) {
$cost = 0.6 * $price;
}
if (!defined($price) or $price eq '') {
$price = 1.667 * $cost;
}
if (!defined($dob) or $dob eq '') {
$dob = _dobFromAge($age);
}
my $insert =
'INSERT INTO STOCK (type, name, cost, price, dob, location) '
"VALUES( \"$type\", \"$name\", \"$cost\", "
"\"$price\", \"$dob\", \"$location\" )";
$self->{DBH}->do ( $insert );
}
$self->SUPER::start_element($data);
}
sub start_document {
my ($self, $data) = @_;
$self->{DBH} = DBI->connect('DBI:mysql:PETS', 'genny', 'joshsgirl')
or die "couldn't connect to PETS: " . DBI->errstr;
$self->SUPER::start_document($data);
}
sub end_document {
my ($self, $data) = @_;
$self->SUPER::end_document($data);
$self->{DBH}->disconnect;
}
1;
��������� Stock2DB ��һ��ʵ�����ǵĵ�һ�� SAX �����������չ�� XML::SAX::Base������������������ܴ��?�����ԣ����κ��¼���
������Ҫ������¼�ֻ���ĵ��Ŀ�ʼ�ͽ����Լ�Ԫ�صĿ�ʼ�¼���start_document �¼���Ҫ��д����ݵ���ݿ⡣end_document �¼�����ر���ݿ⡣Ԫ�ؿ�ʼ��ʱ����Ҫ�鿴����ơ�����ĵ�ֻ�� Ԫ�ء�������Ԫ�غ���Ҫ����Ϊ����ݵ�ɢ�б�����ȡ���ԣ���ʹ�����ǽ������ݸ� DBI ִ�е� SQL INSERT ��䡣
Perl SAX ���е�һЩ�仯���������ѡ�Ϊ�˴�������ֵ�������洢������������Ҫ������ͣ������Ϊ TYPE1 �� TYPE2��Ȼ����ȡ�ʵ�������ֵ�������������ƴ洢Ϊ $data->{Attributes}��
��Ҫ����Ϊ XML::LibXML::SAX::Generator ��̫��¾ɡ��Ժ����ʹ�����µ� XML::SAX::ExpatXS����Ҫʹ�ô洢���Եĵڶ��ַ�ʽ�����ַ�ʽ�У���ʹ���������� type������ָ������һ��ɢ�б�ļ� {}type �����а����Ե�������Ϣ��ֵ��ǰ�ȣ���
��Щ���?���� part3b.pl �У����嵥 8 ��ʾ���ű����ȴ���һ���ɾ�����ݿ�?Ȼ�������ת��Ŀ¼�ļ� pets.xml�������������� DOM ����SAX �ܵ��ĺ����һ�������������Ϊ Stock2DB ��ʵ���������ʵ��ܵ���ǰ�˲��֣������� DOM ������������������ʱ��ͻ����������д��ոմ�������ݿ���С�
�嵥 8. part3b.pl
#!/usr/bin/perl -w
use strict;
use DBI;
use RosieStock;
use Stock2DB;
# create a clean database table
my $dbh = DBI->connect('DBI:mysql:PETS', 'genny', 'joshsgirl')
or die "couldn't connect to PETS: " . DBI->errstr;
$dbh->do('USE PETS');
$dbh->do('DROP TABLE IF EXISTS PETS.STOCK');
my $create = 'CREATE TABLE STOCK ( '
'id INT NOT NULL AUTO_INCREMENT, '
'type VARCHAR(64) NOT NULL, '
'name VARCHAR(64), '
'cost DECIMAL(4,2), '
'price DECIMAL(4,2) NOT NULL, '
'dob VARCHAR(32), ' # should be DATE, YYYY-MM-DD
'location VARCHAR(64), '
'PRIMARY KEY (id) ) ';
$dbh->do($create)
or die "can't create table PETS.STOCK: " . $dbh->errstr;
$dbh->disconnect;
my $fixRosie = RosieStock->new;
$fixRosie->parseAndStyle('pets.xml');
my $dbWriter = Stock2DB->new;
$fixRosie->generate( $dbWriter );
��ô�����ڵõ�ʲô����ˣ���ݿ���ֻ������ Rosie ����Ŀ��Ŀ¼��ת���ɱ���ʽ���
��ϸ�۲� �嵥 7 �еĴ��룬�ͻᷢ�� Stock2DB ҲѰ��ȱ�ٵĻ���Ϊ��ijɱ�����ݼ۸���������ͬ��ͨ��ij���̶��������ݳɱ�����ȱ�ٵļ۸�
�� XML д����ݿ�
��һ������ Lizzie ��Ŀ¼��ʽ������ݿ⣬���嵥 9 ��ʾ��
�嵥 9. Lizzie �����̵�Ŀ���¼
<stock>
<item type="iguana" cost="124.42" location="stockroom" age="1"/>
<item type="pig" cost="15" location="floor" age="0.5"/>
<item type="parrot" cost="700" location="cage" age="6"/>
<item type="pig" cost="117.50" location="floor" age="3.2"/>
</stock>
���� Stock2DB.pm���嵥 7���ṩ�Ĺ���֮�� Lizzie �Ŀ��Ŀ¼���ص���ݿ���ֻ��Ҫʵ��һ�� Stock2DB ��ʵ�����Ѵ��������κ�����д����ݿ⣬Ȼ�����������������ˣ����嵥 10 ��ʾ����
�嵥 10. part3c.pl
#!/usr/bin/perl -w
#use strict;
use XML::SAX::ParserFactory;
use Stock2DB;
$XML::SAX::ParserPackage = "XML::SAX::ExpatXS";
my $parser = XML::SAX::ParserFactory->parser(Handler => Stock2DB->new);
eval { $parser->parse_file('pets2.xml') };
die "can't parse Lizzie's stock file: $@" if $@;
������������ļ������ص�����ݿ��С���ѯ��ݿ⽫�����嵥 11 ��ʾ�Ľ����ע�⣬���еij��ﶼ������ƣ�ȱ�ٵijɱ��ͼ۸�Ҳ�����ˣ����������ʵ��ij������ڣ����е���Ŀ����һ��λ�á�
�嵥 11. �ϲ�����ݿ�
mysql > select * from PETS.STOCK;
+----+--------+----------+--------+--------+------------------+-----------+
| id | type | name | cost | price | dob | location |
+----+--------+----------+--------+--------+------------------+-----------+
| 1 | cat | Madness | 90.00 | 150.00 | 1 February 2004 | Rosies |
| 2 | dog | Maggie | 45.00 | 75.00 | 12 October 2002 | Rosies |
| 3 | cat | Little | 15.00 | 25.00 | 23 June 2006 | Rosies |
| 4 | iguana | iguana-0 | 124.42 | 207.40 | 16 November 2005 | stockroom |
| 5 | pig | pig-1 | 15.00 | 25.00 | 18 May 2006 | floor |
| 6 | parrot | parrot-2 | 700.00 | 999.99 | 16 November 2000 | cage |
| 7 | pig | pig-3 | 117.50 | 195.87 | 5 September 2003 | floor |
+----+--------+----------+--------+--------+------------------+-----------+
7 rows in set (0.00 sec)
mysql>
��ݿ��� SAX �ܵ�
���һ�������ǽ��ոմ�������ݿ�ת��Ϊ XML ��ʽ�����ڵ�������ʽ��̫�ʺ� SQL ��ݿ⣬ʹ�� Date::Calc ����ת���� MySQL ��ϲ���� YYYY-MM-DD ��ʽ����������������������ˡ�
����Ҫʹ�� XML::Generator::DBI �� SAX �ܵ�����ע�⣬����Ϊ XML �ĵ��еĸ�Ԫ�غ���Ԫ���ṩ��ƣ���Ϊ��Щû�д洢�� SQL ���С����⣬Ĭ������� XML::Generator::DBI ����ֵ���Ϊ��Ԫ�ء�Ϊ���� XML �ĵ��н����Ϊ���ԣ���Ҫ�� AsAttributes ѡ������Ϊ 1���嵥 12 ���������������ɵ� XML ����� �嵥 13 ��ʾ��
�嵥 12. part3d.pl
#!/usr/bin/perl -w
use strict;
use DBI;
use XML::Generator::DBI;
use XML::SAX::Writer;
my $dbh = DBI->connect('DBI:mysql:PETS', 'genny', 'joshsgirl')
or die "couldn't connect to PETS: " . DBI->errstr;
my $select = qq ( SELECT * FROM STOCK );
my $writer = XML::SAX::Writer->new(Output => 'inventory.xml');
my $generator = XML::Generator::DBI->new(
dbh => $dbh,
Handler => $writer,
);
$generator->execute($select, undef,
AsAttributes => 1,
QueryElement => undef,
RootElement => 'stock',
RowElement => 'item',
);
$dbh->disconnect;
Ϊ�˱����Ķ����嵥 13 �еĽ�����˵��������Ū�������Ե�˳�����˳�����Ҫ ���� ������������ν����Ҫ��һ���Ĵ��������������⡣
�嵥 13. part3d �����inventory.xml
<stock>
<item cost="90.00" dob="1 February 2004" location="Rosies"
name="Madness" price="150.00" id="1" type="cat"/>
<item cost="45.00" dob="12 October 2002" location="Rosies"
name="Maggie" price="75.00" id="2" type="dog"/>
<item cost="15.00" dob="23 June 2006" location="Rosies"
name="Little" price="25.00" id="3" type="cat"/>
<item cost="124.42" dob="16 November 2005" location="stockroom"
name="iguana-0" price="207.40" id="4" type="iguana"/>
<item cost="15.00" dob="18 May 2006" location="floor"
name="pig-1" price="25.00" id="5" type="pig"/>
<item cost="700.00" dob="16 November 2000" location="cage"
name="parrot-2" price="999.99" id="6" type="parrot"/>
<item cost="117.50" dob="5 September 2003" location="floor"
name="pig-3" price="195.87" id="7" type="pig"/>
</stock>
��Ȼ���� XML::Generator::DBI �dz������� �嵥 12 �еĽű����dz�����һЩ����ľ�����Ϣ��ͨ������ģ����Խ������Щ���㽫����һ���汾�еõ����������� 1.0 �棩�����ڼ���Ҳ��õ������ṩ�� diff �����ļ���
������
��ϵ������ ��һ��ʼ��ָ����ֻҪһ���������ʵ�ֶ��� XML �ĵ������ڴ���� Perl ��ݽṹ֮�������ת����ʹ�� XML::Simple����
�� 2 ���� �����˸�ǿ��� XML �������ߣ�DOM �������������ͻ����¼��� SAX ����������ѧϰ�� XML::SAX::Base �Լ����ʹ����Դ�ļ����������� SAX �¼���
��� 3 ���ֽ���Щ���ݽ���������������˹�ϵ��ݿ�����ݡ����ǽ����˽��������������ת��������ת������������ SAX �¼����ṩ����ݿ⡣Ȼ��ʹ�� SAX �ܵ������ڶ��� XML �ĵ���ת������ӵ�ͬһ����ݿ��У��Ӷ�������������Ŀ¼�ĺϲ��������ʹ�ñ���ϲ���ݵ���ݿ������һ�� SAX �¼���������һ���ܵ�����ת�����������յ�ͳһ�ĵ���
---------------------------------------------------
http://tilt.lib.tsinghua.edu.cn/node/563
--
[1;36mHappy XMLing
[m[1;35m�� ��Դ:��ˮľ���� newsmth.net��[FROM: 114.249.210.*][m
Technical Details
Message-ID:
<4lX9HS$AzT@newsmth.net>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!feeder1.cambriumusenet.nl!feed.tweaknews.nl!81.171.88.250.MISMATCH!newsfeed.eweka.nl!feeder3.eweka.nl!81.171.88.16.MISMATCH!eweka.nl!hq-usenetpeers.eweka.nl!193.201.147.78.MISMATCH!feeder.news-service.com!feeds.phibee-telecom.net!news.byr.edu.cn!news.newsmth.net!NEWSMTHShow Full Headers
Complete Article Headers
X-Google-Thread: 115571,b60c31512182f8b8,start X-Google-NewGroupId: yes X-Google-Attributes: gidf7ebf7e2af,domainid0,public,usenet X-Google-Language: Chinese,GB Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!feeder1.cambriumusenet.nl!feed.tweaknews.nl!81.171.88.250.MISMATCH!newsfeed.eweka.nl!feeder3.eweka.nl!81.171.88.16.MISMATCH!eweka.nl!hq-usenetpeers.eweka.nl!193.201.147.78.MISMATCH!feeder.news-service.com!feeds.phibee-telecom.net!news.byr.edu.cn!news.newsmth.net!NEWSMTH From: thinkhy@newsmth.net-SPAM.no (<Test/>) Newsgroups: cn.bbs.comp.xml Subject: ���� Perl ������Ա�� XML���� 3 ����ת�أ� Date: 27 Apr 2010 15:36:09 GMT Organization: ˮľ���� Message-ID: <4lX9HS$AzT@newsmth.net> Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit X-Filename: XML/N/M.1272382540.80