2015-05-30 2 views
-1

У меня есть структуру XML, как показано ниже:выбирая путь XML для нескольких узлов

<Children> 
    <Stand> 
    <Basics> 
     <Attribute Name="Name">User1</Attribute> 
     <Attribute Name="Scope">LOCAL</Attribute> 
    </Basics> 
    <Attributes/> 
    <Relationship> 
     <Attribute Name="Quantity">2</Attribute> 
     <Attribute Name="good Quantity">0</Attribute> 
    </Relationship> 
    </Stand> 
    <Stand> 
    <Basics> 
     <Attribute Name="Name">User2</Attribute> 
     <Attribute Name="Scope">LOCAL</Attribute> 
    </Basics> 
    <Attributes/> 
    <Relationship> 
     <Attribute Name="Quantity">5</Attribute> 
     <Attribute Name="good Quantity">0</Attribute> 
    </Relationship> 
    </Stand> 
</Children> 

Я хочу, чтобы извлечь Name, Scope, Quantity и good Quantity из приведенного выше XML. Я использую выражение Xpath:

//Children/Stand/* [self::Basics | self::Relationship] 

В результате я получаю:

User1 LOCAL null null 
null null 2  0 
User2 LOCAL null null 
null null 5  0 

Я хочу привести ниже образом:

User1 LOCAL 2  0 
User2 LOCAL 5  0 

Может кто-нибудь помочь, чтобы получить желаемый результат ?

ответ

1

Я считаю, что у этого вопроса есть что-то еще, кроме xpath, потому что xpath способен только возвращать узлы или примитивный тип вроде строки, что-то вроде этого, а не структурированный результат таблицы.

Говоря в xpath только точке зрения, ваш текущий xpath выбирает как , так и <Relationship> элементов, каждый из которых находится в отдельной строке в таблице результатов. Я считаю, что вы хотите, чтобы XPath выбрать <Stand> элементов вместо:

//Children/Stand 

, а затем сделать столбцы выбор относительно текущего <Stand> элемента:

Basics/Attribute[@Name="Name"] 
Basics/Attribute[@Name="Scope"] 
Relationship/Attribute[@Name="Quantity"] 
Relationship/Attribute[@Name="good Quantity"] 

Таким образом, все <Attribute> элементов, что соответствует одному и тому же <Stand> предку отображаются в той же строке в таблице результатов.

+0

Я использую последовательность XML и извлекать значения, указанные выше. Я использую свой код ниже для справки. Я пробовал так, как вы упомянули, и не работает. ВЫБОР экстракт (значение (MN), '/ Основы/Атрибут [@ Name = "Name"]/text()'). GetStringVal() AS Module_Name, extract (value (MN), '/ Relationship/Attribute [@ Name = "Configured Quantity"]/text() '). GetStringVal() AS Quantity, extract (значение (MN) ",/Basics/Attribute [@ Name =" Scope "]/text()'). getStringVal() AS Scope FROM table A, table (xmlsequence (extract (XMLTYPE (A.XML_INFO), '// Children/Stand/[self :: Basics | self :: Relationship]'))) MN –

+0

@narendragc не забудьте в комментарии (на всякий случай) – har07

+0

@narendragc Прочтите мой предыдущий комментарий. В любом случае, попробуйте изменить xpath для 'xmlsequence (...)' part to '// Children/Stand', может быть? Это также полезно для сравнения, если вы публикуете первоначальный запрос (прежде чем пытаться применить мое предложение) – har07

1

Рассматривали ли вы применение языка сценариев? Потому что то, что я сделал бы, это что-то вроде этого, в perl, используя довольно отличную библиотеку для обработки XML XML.

#!/usr/bin/perl 
use strict; 
use warnings; 

use XML::Twig; 

sub print_user { 
    my ($twig, $stand) = @_; 

    print join("\t", 
     $stand->get_xpath('./Basics/Attribute[@Name="Name"]',  0)->text, 
     $stand->get_xpath('./Basics/Attribute[@Name="Scope"]', 0)->text, 
     $stand->get_xpath('./Relationship/Attribute[@Name="Quantity"]', 0)->text, 
     $stand->get_xpath('./Relationship/Attribute[@Name="good Quantity"]', 0) 
      ->text, 
     ), 
     "\n"; 
} 

XML::Twig->new('twig_handlers' => { 'Stand' => \&print_user }) -> parsefile ('xmlfile'); 

Или, если вы предпочитаете немного более кратким (и предполагая, что атрибуты упорядочены таким же образом):

use XML::Twig; 
XML::Twig->new('twig_handlers' => { 'Stand' => sub { print "\n" }, 
            'Attribute' => sub { print $_ -> text,"\t" } }) 
    ->parsefile ('your_file_name.xml'); 
Смежные вопросы