Попытка использовать функции сопоставления строковых шаблонов match и gmatch в lua для анализа файла xml, но не получение ожидаемого результата

Я хочу проанализировать и распечатать определенные данные из XML-файла с помощью Lua.

Вот фрагмент моего XML-кода:

<Service>
<NewInstance ref="E961625723F5FDC8BD550077282E074C">
<Std>DiscoveredElement</Std>
<Key>E961625723F5FDC8BD550077282E074C</Key>
<Attributes>
<Attribute name="TARGET_TYPE" value="j2ee_application" />
<Attribute name="AppType" value="ear" />
<Attribute name="TARGET_GUID" value="E961625723F5FDC8BD550077282E074C" />
<Attribute name="TARGET_NAME"
value="/Farm_b2b4_sys20_b2b4_domain/b2b4_domain/WLS_B2B4a/worklistapp" />
</Attributes>
</NewInstance>
<NewInstance ref="FD8A116D5C8DD2332B024BCBD6A81BD8">
<Std>DiscoveredElement</Std>
<Key>FD8A116D5C8DD2332B024BCBD6A81BD8</Key>
<Attributes>
<Attribute name="TARGET_TYPE" value="composite" />
<Attribute name="SERVICE_TYPE" value="" />
<Attribute name="TARGET_NAME" value="LAB-DB-B-AIX-Grp" />
<Attribute name="TARGET_GUID" value="FD8A116D5C8DD2332B024BCBD6A81BD8" />
</Attributes>
</NewInstance>
</Service>

Из этого XML-файла я хочу отобразить значение TARGET_TYPE и TARGET_NAME, соответствующее каждому тегу NewInstance ref в файле.

Я пробовал это двумя способами - код Lua 1:

local file = io.open("sample.xml", "rb")   -- Open file for reading (binary data)
for instance in file:read("*a"):gmatch("<NewInstance ref=\"(.-)\">") do  -- Read whole file content and iterate through attribute matches

TARGET_TYPE = instance:gmatch('TARGET_TYPE.-value=\"(.-)\"')
TARGET_NAME = instance:gmatch('TARGET_NAME.-value=\"(.-)\"')
print("New Instance :", instance)
print("Target Type : ",TARGET_TYPE)
print("Target Name : ",TARGET_NAME)
end
file:close()

Результат, который я получаю для этого, -

New Instance :  E961625723F5FDC8BD550077282E074C
Target Type :   function: 0050E9C0
Target Name :   function: 0050EA10
New Instance :  FD8A116D5C8DD2332B024BCBD6A81BD8
Target Type :   function: 0050EA60
Target Name :   function: 0050EAB0
Exit code: 0

Он собирает некоторые случайные значения для имени цели и типа цели.

Луа-код 2:

local file = io.open("sample.xml", "rb")   -- Open file   for reading (binary data)
for instance in file:read("*a"):gmatch("<NewInstance ref=\"(.-)\">") do
TARGET_TYPE = instance:match('TARGET_TYPE.-value="(.-)"')
TARGET_NAME = instance:match('TARGET_NAME.-value="(.-)"')
print("New Instance :", instance)
print("Target Type : ",TARGET_TYPE)
print("Target Name : ",TARGET_NAME)
end
file:close()

Это дает результат:

lua -e "io.stdout:setvbuf 'no'" "prac.lua" 
New Instance :  E961625723F5FDC8BD550077282E074C
Target Type :   nil
Target Name :   nil
New Instance :  FD8A116D5C8DD2332B024BCBD6A81BD8
Target Type :   nil
Target Name :   nil
Exit code: 0

Пожалуйста, предложите способ получить требуемое и правильное значение атрибута.


person Manisha Oswal    schedule 23.09.2015    source источник


Ответы (1)


В общем, не рекомендуется использовать шаблон Lua (или регулярное выражение) для анализа XML. Вместо этого используйте анализатор XML.

Во всяком случае, для этой конкретной проблемы первый код не работает, потому что gmatch — это итератор, его нельзя использовать таким образом.

Для второго кода шаблон <NewInstance ref=\"(.-)\"> захватывает только часть ref=, вместо этого вы должны захватить часть между <NewInstance ref= и </NewInstance>:

for instance in xml:gmatch("<NewInstance ref=\".-\">(.-)</NewInstance>") do 
person Yu Hao    schedule 23.09.2015