4

次のようなXMLファイルからデータを解析しようとしています

<level>
  <bg>details1</bg>
  <bg>details2</bg>
</level>

xml.find (bg)を使用すると、詳細 1 しか取得できません。これは、xml.find が検索条件または nil に一致する最初の (サブ) テーブルを返すためです。

両方のbgを読みたい場合。LuaXMLでそれを達成するにはどうすればよいですか? または、他のLua XMLライブラリ作品を紹介してください。

アドオン私の実際のシナリオはこのようなものです

<a>
   <b>
    <level>
      <bg>details1</bg>
    </level>
    <level>
      <bg>details2</bg>
    </level>
   </b>
</a>

b オブジェクト全体を取得し、xml.tag を使用してレベルアウトを読み取る必要があることはわかっています。しかし、私の試みは失敗します。このコードについて教えてください。


Mike Corcoran の提案に基づいて、最終的にこのようなソリューションを取得しました。

require 'luaxml'

local text = [[
<a>
   <bcde>
    <level>
      <bg>details1</bg>
    </level>
    <level>
      <bg>details2</bg>
    </level>
   </bcde>
</a>
]]

local txml = xml.eval(text)
for _, node in pairs(txml:find("bcde")) do
 if node.TAG ~= nil then
        if node[node.TAG] == "level" then
            local bg = node:find("bg")
                if bg ~= nil then
                for i=1, #bg do
                    print( bg[i])
                end
            end
        end
    end
end

レイヤーが多すぎて遅いようです..効率を改善するための提案はありますか?

4

2 に答える 2

3

呼び出した後xml.load、ロードしたばかりの xml ファイルを表すテーブルが返されます。テーブル内の対応する数値インデックスにアクセスすることで、特定のノードに到達できます。

require 'luaxml'

local level = xml.load('level.xml')

-- level[1] == <bg>details1</bg>
-- level[2] == <bg>details2</bg>
for i = 1, #level do
  print(level[i])
end

編集:編集した質問から、xml ファイルからデータを引き出す 1 つの方法を次に示します。

require 'luaxml'

local xmlroot = xml.load('your.xml')
local b = xmlroot:find 'b'

for level = 1, #b do
  print(b[level][1][1])
end

xml 形式を制御できる場合は、多少変更して解析を読みやすくすることができます。

<a>
   <b>
    <level bg="details1"> </level>
    <level bg="details2"> </level>
   </b>
</a>

この変更により、ノードbg属性になります。levelこれにより、間接性が 1 レベル減少します。属性にアクセスbgするには、lua.演算子をbgキーとして使用します。解析ループは、次のように変更できます。

for level = 1, #b do
  print(b[level].bg)
end
于 2013-07-17T19:07:00.197 に答える