2017-03-06 181 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。 –