XML :: Lib XML поиск ошибок XML узлов с пространством имен - PullRequest
1 голос
/ 27 января 2020

Я пишу парсер XML и у меня проблема с программой, обрабатывающей ссылку. Я пытаюсь проанализировать настройки / настройки иерархии XML, а затем найти узел «Значение». Ниже приведен пример XML:

<?xml version='1.0' ?>
<Settings xmlns='http://hme.com/Settings.xsd'>
  <Setting SID="0">
    <Name>Store ID</Name>
    <Value>72</Value>
  </Setting>
  <Setting SID="1">
    <Name>Deprecated</Name>
    <Value>0</Value>
  </Setting>
  <Setting SID="8">
    <Name>Open Store Hours Sunday</Name>
    <Value>25200</Value>
  </Setting>

Вот код, который я использую для анализа XML

my $doc = $parser->parse_file($settings_file) or die "Couldn't parse timer settings\n";

#Sunday
for my $reviewer ($doc->findnodes('/Settings/Setting[@SID="8"]')) {
  my ($name) = $reviewer->findnodes('Value');
  $name->removeChildNodes();
  $name->appendText('109800');
}

Когда я удаляю xmlns='http://hme.com/Settings.xsd' из В файле XML нет проблем с заменой узла значения. Как только я ввожу ссылку обратно в XML, код перестает работать и не обновляет лист xml. Есть ли способ обработать эту ссылку или удалить ее, чтобы я мог правильно обновить файл?

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Вы просите найти узлы с пространством имен null и с именем Settings. В документе нет таких узлов, поэтому findnodes правильно ничего не возвращает.

Вы хотите найти узлы с пространством имен http://hme.com/Settings.xsd и именем Settings. Для этого вы можете использовать следующее:

my $xpc = XML::LibXML::XPathContext->new();
$xpc->registerNs( s => 'http://hme.com/Settings.xsd' );

for ($xpc->findnodes('/s:Settings/s:Setting[@SID="8"]'), $doc) {
   ...
}
0 голосов
/ 30 января 2020

Я смог заставить это работать, используя этот код.

my $dom = XML::LibXML->load_xml(location => $filename);

my $xpc = XML::LibXML::XPathContext->new($dom);
$xpc->registerNs('xsd',  'http://hme.com/Settings.xsd');

my($match1) = $xpc->findnodes('//xsd:Settings/xsd:Setting[@SID="8"]/xsd:Value');
$match1->removeChildNodes();
$match1->appendText('23400');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...