Процесс цитирует строки в xml-файле
Версия Perl: perl, v5. 10. 1 ( * ) построен для x86_64-linux-thread-multi
Я относительно новичок в perl. Я попытался посмотреть на различные утилиты обработки XML для Perl, XML:: Simple, XML::Parser, XML::LibXML, XML::DOM, XML::XML::Twig, XML:: XPath и т. д.
Я пытаюсь обработать некоторый XML, который имеет кавычки в части value. Я специально ищу, чтобы извлечь название из приведенного ниже XML, однако, я споткнулся об это немного сейчас и был бы признателен немного помощи, если это возможно.
$VAR1 = {
'issue' => {
'priority' => {
'fid' => '11',
'content' => '3 - Best Effort'
},
'transNum' => {
'fid' => '2',
'content' => '170'
},
'dueDate' => {
'fid' => '17',
'content' => '1327944695'
},
'status' => {
'fid' => '18',
'content' => 'Open - Unassigned'
},
'createdBy' => {
'fid' => '15',
'content' => '32'
},
'title' => {
'fid' => '20',
'content' => 'Testing on spider - issue with "quotation marks"'
},
'description' => {
'fid' => '22',
'content' => 'Noticed issue with title having quotes in title'
},
'issueNum' => {
'fid' => '1',
'content' => '33'
}
}
};
Используя XML:: LibXML и следующий код (Примечание: выше, если печать содержимого переменной $issueXML):
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($issueXML);
print $doc->toString;
Это выводит:
<?xml version="1.0" encoding="utf-8"?>
<issues>
<issue>
<issueNum fid="1">33</issueNum>
<transNum fid="2">170</transNum>
<createdBy fid="15">32</createdBy>
<status fid="18">Open - Unassigned</status>
<title fid="20">Testing on spider - issue with "quotation marks"</title>
<priority fid="11">3 - Best Effort</priority>
<description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description>
<dueDate fid="17">1327944695</dueDate>
</issue>
</issues>
Я ищу, чтобы специально извлечь значение для тегаtitle .
Когда я обрабатывал с помощью XML:: Parser, я продолжал заканчивать только с последней кавычкой. Я хотел бы сохранить тот же формат строки для отображения:
Тестирование на spider-issue с "кавычками"
Я немного на данный момент перегружен различными функциями обработки XML. Я уже некоторое время пытаюсь понять это, и я серьезно вращаю свои колеса.
ТИА, Спасибо за любую помощь,
С уважением, Скотт
4 ответа:
Еще один переход с XML:: LibXML . У вас не должно возникнуть проблем с кавычками внутри текстовых узлов.
#!/usr/bin/perl use strict; use warnings; use XML::LibXML; use Data::Dumper; my $xml = XML::LibXML->load_xml(string => q{<?xml version="1.0" encoding="utf-8"?> <issues> <issue> <issueNum fid="1">33</issueNum> <transNum fid="2">170</transNum> <createdBy fid="15">32</createdBy> <status fid="18">Open - Unassigned</status> <title fid="20">Testing on spider - issue with "quotation marks"</title> <priority fid="11">3 - Best Effort</priority> <description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description> <dueDate fid="17">1327944695</dueDate> </issue> </issues> }); my $title = $xml->find('/issues/issue/title'); print $title->get_node(0)->textContent;
Я не уверен, с какой проблемой вы столкнулись с кавычками. Это просто символ, как и любой другой, за исключением значений атрибутов, где может потребоваться использовать сущность, если кавычка уже используется в качестве разделителя значений. Вы уверены, что "проблема" не только в том, как Data::Dumper отображает структуру данных, созданную XML::Simple?
В любом случае держитесь подальше от XML::Parser, который слишком низкоуровневый, используйте XML::LibXML или XML::Twig. XML:: Simple, кажется, генерирует Много вопросов, особенно от людей, не знакомых с Perl, поэтому я не уверен, что это правильный инструмент для использования.
Вот решение с XML:: Twig, но есть и другие способы сделать это, в зависимости от того, что именно вы хотите сделать с заголовками.
#!/usr/bin/perl use strict; use warnings; use XML::Twig; my $issueXML=q{<?xml version="1.0" encoding="utf-8"?> <issues> <issue> <issueNum fid="1">33</issueNum> <transNum fid="2">170</transNum> <createdBy fid="15">32</createdBy> <status fid="18">Open - Unassigned</status> <title fid="20">Testing on spider - issue with "quotation marks"</title> <priority fid="11">3 - Best Effort</priority> <description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description> <dueDate fid="17">1327944695</dueDate> </issue> </issues> }; my $t= XML::Twig->new( twig_handlers => { title => sub { print $_->text, "\n"; } }) ->parse( $issueXML);
Я обычно использую XML::XSH2 для обработки XML. Ваша задача упрощается до:
open FILE.xml ; for //title echo (.) ;
Лучший способ извлечь биты из XML-это запросXPath .
В этом случае вы ищете элемент 'title', внутри элемента 'issue', внутри элемента'issues'.
Поэтому ваш запрос XPath-это просто "/ / issues / issue / title".
В двух строках кода можно использовать XML:: LibXML:: XPathContext для выполнения запроса XPath, который возвращает содержимое элемента, который вы ищете.
Этот фрагмент кода продемонстрирует простую способ выполнения запроса XPath. Важным моментом здесь являются две строки, следующие за комментарием "соответствующий бит здесь".
Для получения дополнительной информации см. документации для XML::в libxml::XPathContext
#!/usr/bin/perl use strict; use warnings; use XML::LibXML; my $xml = XML::LibXML->load_xml(string => q{<?xml version="1.0" encoding="utf-8"?> <issues> <issue> <issueNum fid="1">33</issueNum> <transNum fid="2">170</transNum> <createdBy fid="15">32</createdBy> <status fid="18">Open - Unassigned</status> <title fid="20">Testing on spider - issue with "quotation marks"</title> <priority fid="11">3 - Best Effort</priority> <description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description> <dueDate fid="17">1327944695</dueDate> </issue> </issues> }); # Relevant bit here my $xc = XML::LibXML::XPathContext->new($xml); my $title = $xc->find('//issues/issue/title'); print "$title\n"; # prints: # Testing on spider - issue with "quotation marks"