尝试在 lua 中使用 match 和 gmatch 字符串模式匹配函数来解析 xml 文件但未获得预期结果
Trying to use match and gmatch string pattern matching functions in lua to parse an xml file but not getting the expected result
我想使用 Lua 从 XML 文件中解析和打印特定数据。
这是我的 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
它正在为目标名称和目标类型选取一些随机值。
Lua 代码 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
请建议一种检索所需且正确的属性值的方法。
一般来说,使用 Lua 模式(或正则表达式)来解析 XML 并不是一个好主意。相反,使用 XML 解析器。
无论如何,对于这个特定问题,第一个代码不起作用,因为 gmatch
是一个迭代器,它不应该那样使用。
对于第二个代码,模式 <NewInstance ref=\"(.-)\">
仅捕获 ref=
部分,您应该捕获 <NewInstance ref=
和 </NewInstance>
之间的部分:
for instance in xml:gmatch("<NewInstance ref=\".-\">(.-)</NewInstance>") do
我想使用 Lua 从 XML 文件中解析和打印特定数据。
这是我的 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
它正在为目标名称和目标类型选取一些随机值。
Lua 代码 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
请建议一种检索所需且正确的属性值的方法。
一般来说,使用 Lua 模式(或正则表达式)来解析 XML 并不是一个好主意。相反,使用 XML 解析器。
无论如何,对于这个特定问题,第一个代码不起作用,因为 gmatch
是一个迭代器,它不应该那样使用。
对于第二个代码,模式 <NewInstance ref=\"(.-)\">
仅捕获 ref=
部分,您应该捕获 <NewInstance ref=
和 </NewInstance>
之间的部分:
for instance in xml:gmatch("<NewInstance ref=\".-\">(.-)</NewInstance>") do