2010-01-17 4 views
3

У меня есть файл XML, как это:Как распечатать значение атрибута вместо содержимого элемента?

 <wave waveID="1"> 
     <well wellID="1" wellName="A1"> 
      <oneDataSet> 
      <rawData>0.1123975676</rawData> 
      </oneDataSet> 
     <well> 

Я пытаюсь напечатать атрибут wellName со следующим кодом:

my @n1 = $xc->findnodes('//ns:wave[@waveID="1"]'); 
    # so @n1 is an array of nodes with the waveID 1 
    # Above you are searching from the root of the tree, 
    # for element wave, with attribute waveID set to 1. 
foreach $nod1 (@n1) { 
    # $nod1 is the name of the iterator, 
    # which iterates through the array @n1 of node values. 
my @wellNames = $nod1->getElementsByTagName('well'); #element inside the tree. 
    # print out the wellNames : 
foreach $well_name (@wellNames) { 
    print $well_name->textContent; 
    print "\n"; 
     } 

но вместо распечатки wellName, я распечатывания значения rawData (например, 0.1123975676). Я не понимаю, почему, не так ли? Я попытался прокомментировать код, чтобы понять, что происходит, но если комментарии неверны, пожалуйста, исправьте меня. Благодарю.

+0

Можете ли вы привести пример того, что вы имеете в виду под «сырой RAWDATA»? Вы имеете в виду ссылку «SCALAR (0 × 814f5c4)»? –

+0

Спасибо, я добавил более подробно на вопрос. – John

+0

Вы заметите, что XML содержит тег «rawData». 'textContent' выводит текстовый контент (а не атрибуты) этого узла и всех дочерних узлов - другими словами, ожидается, что он напечатает' 0.1123975676' –

ответ

3

Предполагая, что вы хотите, чтобы атрибут всех well детей конкретного wavewellName, выразить, что в XPath, а не зацикливание вручную:

foreach my $n ($xc->findnodes(q<//ns:wave[@waveID='1']/ns:well/@wellName>)) { 
    print $n->textContent, "\n"; 
} 
+1

+1. Это правильный способ сделать это. –

1

$node->attributes() возвращает список узлов атрибутов.

Альтернативой является выбор узла атрибута непосредственно с помощью выражения XPath, а не использование XPath, чтобы пройти часть пути и вручную сделать все остальное.

+0

Спасибо, я пробовал это, но это не сработало, можете ли вы помочь пожалуйста? my @test = $ nod1-> attributes(); # должен вернуть список узлов атрибутов # теперь получить атрибут wellName из этого списка узлов атрибутов foreach $ t (@test) { print $ t-> getAttribute (wellName); – John

+0

Во-первых, вы хотите называть «атрибуты» на узле, для которого вы хотите получить атрибуты. Во-вторых, в libxml нет метода getAttribute() ', вам нужно перебрать список атрибутов и вызвать' nodeName', чтобы найти тот, который вы хотите. –

Смежные вопросы