2017-03-06 57 views
-2
<?xml version="1.0" encoding="UTF-8" standalone="true"?> 
<hierarchy rotation="0"> 
<node class="android.widget.FrameLayout" bounds="[0,0][768,1184]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="" text="" index="0"> 
<node class="android.widget.FrameLayout" bounds="[0,0][768,1184]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/panel_holder" text="" index="0"> 
<node class="android.widget.FrameLayout" bounds="[0,0][768,1184]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/notification_panel" text="" index="0"> 
<node class="android.widget.FrameLayout" bounds="[0,0][768,1184]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/notification_container_parent" text="" index="0"> 
<node class="android.widget.RelativeLayout" bounds="[0,0][768,120]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="true" enabled="true" clickable="true" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/header" text="" index="1"> 
<node class="android.widget.LinearLayout" bounds="[48,8][153,62]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/clock" text="" index="0"> 
<node class="android.widget.TextView" bounds="[48,21][103,59]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/time_view" text="5:28" index="0"/> 
<node class="android.widget.TextView" bounds="[103,21][153,59]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/am_pm_view" text=" PM" index="1"/> 
</node> 
<node class="android.widget.FrameLayout" bounds="[16,62][260,100]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/date_group" text="" index="1"> 
<node class="android.widget.TextView" bounds="[48,62][260,100]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/date_expanded" text="Monday, March 6" index="0"/> 
</node> 
<node class="android.widget.LinearLayout" bounds="[542,0][658,120]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/system_icons_super_container" text="" index="3"> 
<node class="android.widget.FrameLayout" bounds="[542,35][650,85]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/system_icons_container" text="" index="0"> 
<node class="android.widget.LinearLayout" bounds="[542,35][650,85]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/system_icons" text="" index="0"> 
<node class="android.widget.LinearLayout" bounds="[547,43][631,77]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/signal_cluster" text="" index="1"> 
<node class="android.widget.FrameLayout" bounds="[547,43][583,77]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="Wifi signal full." package="com.android.systemui" resource-id="com.android.systemui:id/wifi_combo" text="" index="0"> 
<node class="android.widget.ImageView" bounds="[547,43][583,77]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/wifi_signal" text="" index="0"/> 
</node> 
<node class="android.widget.LinearLayout" bounds="[583,43][617,77]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/mobile_signal_group" text="" index="1"> 
<node class="android.widget.FrameLayout" bounds="[583,43][617,77]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="3G Phone two bars." package="com.android.systemui" resource-id="com.android.systemui:id/mobile_combo" text="" index="0"> 
<node class="android.widget.ImageView" bounds="[583,43][617,77]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/mobile_signal" text="" index="0"/> 
</node> 
</node> 
</node> 
<node class="android.view.View" bounds="[631,45][650,74]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="Battery 100 percent." package="com.android.systemui" resource-id="com.android.systemui:id/battery" text="" index="2"/> 
</node> 
</node> 
</node> 
<node class="android.widget.FrameLayout" bounds="[658,0][726,120]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/multi_user_switch" text="" index="4"> 
<node class="android.widget.ImageView" bounds="[670,38][714,82]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/multi_user_avatar" text="" index="0"/> 
</node> 
</node> 
</node> 
</node> 
<node class="android.view.View" bounds="[0,0][768,1184]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/scrim_behind" text="" index="1"/> 
<node class="android.view.View" bounds="[0,0][768,1184]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/scrim_in_front" text="" index="2"/> 
<node class="android.widget.FrameLayout" bounds="[0,0][768,50]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/status_bar" text="" index="3"> 
<node class="android.widget.LinearLayout" bounds="[0,0][768,50]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/status_bar_contents" text="" index="0"> 
<node class="android.widget.FrameLayout" bounds="[12,0][575,50]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.android.systemui" resource-id="com.android.systemui:id/notification_icon_area" text="" index="0"/> 
</node> 
</node> 
</node> 
</hierarchy> 

我有一個XML文件,並試圖提取「text」屬性,例如「ana.zx」,並將其放置在不同的文件中,或者將其轉換爲字符串。Nokogiri實施協助

我設法達到了將文件保存到存儲並打開它的地步,但我還沒有弄清楚如何使用Nokogiri來提取該屬性。

這是我到目前爲止有:

doc = File.open("window_dump.xml") { |f| Nokogiri::XML(f)} 
+0

您的XML是**格式不正確**。請編輯您的代碼示例並提供[mcve]。 – zx485

+0

歡迎來到Stack Overflow。請閱讀「[問]」,包括鏈接的pages_和「[mcve]」以及「[Stack Overflow用戶需要多少研究工作?](http://meta.stackoverflow.com/questions/261592)」。你的問題顯示沒有找到一個節點的嘗試,你需要閱讀Nokogiri教程和備忘單,在SO和Internet上搜索,嘗試一些事情,然後詢問關於具體問題的詳細的具體問題。將XML採樣到最小,最小的塊,這會重現問題,除此之外的任何東西都會浪費我們的時間,試圖幫助您。 –

回答

0

你的XML是無效的。 XML規範非常嚴格,所以文檔必須是有效的,不像HTML是小狗友好的。

這裏是引入nokogiri發現的錯誤:

# => [#<Nokogiri::XML::SyntaxError: XML declaration allowed only at the start of the document>, 
#  #<Nokogiri::XML::SyntaxError: Opening and ending tag mismatch: node line 4 and hierarchy>, 
#  #<Nokogiri::XML::SyntaxError: Premature end of data in tag hierarchy line 3>] 

解析文檔使用的返回值的errors方法,看看有什麼引入nokogiri不得不做解析文檔後。如果出現錯誤,Nokogiri可能需要修改文檔才能返回某些內容,並且這些更改後的節點可以隱藏信息。在您的文檔中,它在文本的早期階段,因此您可能會失去對所有後續子節點的訪問權限。

如果errors顯示存在問題,則在需要更多信息時使用XML驗證程序。至少我會將文件拖入Vim並讓它重新格式化文檔,以便我可以檢查其縮進/嵌套,因爲通常問題是由於缺少結束標記。

而且,這裏是如何,我們通常打開和分析使用引入nokogiri文件:

doc = Nokogiri::XML(File.open('path/to/file.xml')) 

引入nokogiri將讀取並關閉文件給你,讓使用塊是不必要的。

+0

此XML文件是「adb shell uiautomator dump」語法的結果,它顯示Android設備上的所有可見元素。我必須使用它... –

+0

然後你必須在解析之前進行修復。解析器期望有效的XML。 –