2014-11-09 8 views
-1

Это код XML фрагмент:Как получить доступ к параметрам XML условно

<testcase name="T.3.03.02"> 
    <cmd>CMD_EXPORT_RAM_KEY</cmd> 
    <sreg_pre>40</sreg_pre> 
    <sreg_pre_bitmask>ff</sreg_pre_bitmask> 
    <sreg_post>40</sreg_post> 
    <sreg_post_bitmask>ff</sreg_post_bitmask> 
    <erc>ERC_NO_ERROR</erc> 
    <testvector> 
     <parameter name="UID" type="info">000000000000000000000000000002</parameter> 
     <parameter name="UID'" type="info">000000000000000000000000000002</parameter> 
     <parameter name="KeyId" type="info">0e</parameter> 
     <parameter name="Key" type="info">0f0e0d0c0b0a09080706050403020100</parameter> 
     <parameter name="AuthId" type="info">00</parameter> 
     <parameter name="KeyAuth" type="info">2b7e151628aed2a6abf7158809cf4f3c</parameter> 
     <parameter name="Old counter value of updated key slot" type="info">0000000</parameter> 
     <parameter name="New counter value C'" type="info">0000000</parameter> 
     <parameter name="Protection flags F'" type="info">00</parameter> 
     <parameter name="M1" type="output">000000000000000000000000000002e0</parameter> 
     <parameter name="M2" type="output">152876f29dc7ca8d18e38d70374492b05d908c8c584a0409849a553c75254def</parameter> 
     <parameter name="M3" type="output">bc6e79bc4458339174fc80fb08b83188</parameter> 
     <parameter name="M4" type="output">000000000000000000000000000002e07783b86ae87b87e3ca12809c2df75fae</parameter> 
     <parameter name="M5" type="output">c8fcc8859c69c8bd840ce8e24c5114e9</parameter> 
    </testvector> 
    <precondition>RAM_KEY_PLAIN = 1; RAM_KEY_EMPTY = 0</precondition> 
    <description>Export plain RAM_KEY with external debugger attached; Note: The security flags SECURE_BOOT_PROTECTION and DEBUGGER_PROTECTION of the key SECRET_KEY are inherited from MASTER_ECU_KEY.</description> 
</testcase> 

Я хочу, чтобы получить доступ ко всем "parameter name="Key" type="info" значения.

Как получить доступ к этим значениям условно, если условие <cmd>CMD_EXPORT_RAM_KEY(second line in XML)</cmd> действительно.

В этом файле XML есть также другие команды (<cmd> строк) также с параметром «Ключ», , но в этих случаях я не хочу получать значения ключа.

Я не запускал его.

Может ли кто-нибудь помочь мне с некоторыми идеями?

+1

см. Http://www.nokogiri.org/ – xlembouras

ответ

0

Будет что-то вроде этой работы?

doc = Nokogiri::parse(File.read("data.xml")) 
    check = doc.xpath("//cmd").select{|el| el.children[0].text == "CMD_EXPORT_RAM_KEY" } 
    puts "Check: %i" % check.size 
    if(check.size == 0) 
    ## Do stuff here 
    end 
0

Попробуйте ниже XPath с Nokogiri:

//testcase/cmd[text()='CMD_EXPORT_RAM_KEY']/../testvector/parameter[@name="Key" and @type="info"] 

Конечно, вы можете параметризовать значения CMD_EXPORT_RAM_KEY и @name/@type.

+0

Это было ТОЧНО, что мне нужно! В следующий раз вы получите пиво, если встретим нас :-) –

0

Трюк заключается в том, чтобы найти нужные вам, используя селектор, а затем при необходимости сузить дальше.

Использование селектора CSS 'parameter[@name="Key"][@type="info"]' Nokogiri легко находит единственное вхождение в ваш образец. Если бы было больше, потом еще будут возвращены:

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<testcase name="T.3.03.02"> 
    <testvector> 
     <parameter name="UID" type="info">000000000000000000000000000002</parameter> 
     <parameter name="Key" type="info">0f0e0d0c0b0a09080706050403020100</parameter> 
    </testvector> 
</testcase> 
EOT 

doc.search('parameter[@name="Key"][@type="info"]').map(&:content) 
# => ["0f0e0d0c0b0a09080706050403020100"] 

Я использовал CSS, потому что он выглядит менее, как линии шума, чем эквивалентный селекторе XPath будет.

Кроме того, при подаче данных образца уменьшите его до минимума, необходимого для проверки кода. Все, что выходит за рамки этого, теряет наше время и, если оно слишком много, может фактически заставить вас не получить ответов, потому что никто не хочет пробираться сквозь это.

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