我有以下xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:enabled="false" android:orientation="horizontal" android:id="@id/action_container"
android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip"
android:layout_height="48.0dip" android:layout_weight="1.0"
style="@style/Widget.Compat.NotificationActionContainer"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image"
android:layout_width="@dimen/notification_action_icon_size"
android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside"
android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc"
android:ellipsize="end"
android:layout_gravity="start|center"
android:id="@id/action_text" android:paddingLeft="4.0dip"
android:clickable="false" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true" android:alpha="0.5"
style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
我正在尝试删除多余的空格和换行符。
这是我需要的结果:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:enabled="false" android:orientation="horizontal" android:id="@id/action_container" android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip" android:layout_height="48.0dip" android:layout_weight="1.0" style="@style/Widget.Compat.NotificationActionContainer" xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image" android:layout_width="@dimen/notification_action_icon_size" android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside" android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc" android:ellipsize="end" android:layout_gravity="start|center" android:id="@id/action_text" android:paddingLeft="4.0dip" android:clickable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:alpha="0.5" style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
我尝试使用此命令
sed -i '' 's/^[ \t]*//;s/[ \t]*$//' file.xml
它删除了一些空格,但没有删除换行符。
最终,我希望能够通过仅知道其id(@ id / action_image)将ImageView的宽度(android:layout_width)更改为5dip。
我希望能够通过其ID获取xml元素并更改其其他参数的值
使用xmlstarlet
及其fo
命令:
$ xmlstarlet fo file.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:enabled="false" android:orientation="horizontal" android:id="@id/action_container" android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip" android:layout_height="48.0dip" android:layout_weight="1.0" style="@style/Widget.Compat.NotificationActionContainer">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image" android:layout_width="@dimen/notification_action_icon_size" android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside" android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc" android:ellipsize="end" android:layout_gravity="start|center" android:id="@id/action_text" android:paddingLeft="4.0dip" android:clickable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:alpha="0.5" style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
用于xmlstarlet fo -n
完全省略缩进。
要修改android:layout_width
属性为的ImageView
节点的android:id
属性@id/action_image
,您绝对不需要重新格式化XML文档:
$ xmlstarlet ed -u '//ImageView[@android:id="@id/action_image"]/@android:layout_width' -v "5dip" file.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:enabled="false" android:orientation="horizontal" android:id="@id/action_container" android:background="@null" android:paddingLeft="4.0dip" android:layout_width="0.0dip" android:layout_height="48.0dip" android:layout_weight="1.0" style="@style/Widget.Compat.NotificationActionContainer">
<ImageView android:enabled="false" android:layout_gravity="start|center" android:id="@id/action_image" android:layout_width="5dip" android:layout_height="@dimen/notification_action_icon_size" android:scaleType="centerInside" android:alpha="0.5"/>
<TextView android:enabled="false" android:textColor="#ffcccccc" android:ellipsize="end" android:layout_gravity="start|center" android:id="@id/action_text" android:paddingLeft="4.0dip" android:clickable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:alpha="0.5" style="@style/Widget.Compat.NotificationActionText"/>
</LinearLayout>
在这里,我们xmlstarlet
用来编辑所要节点的正确属性。使用XPath表达式选择属性
//ImageView[@android:id="@id/action_image"]/@android:layout_width
将//ImageView
在XPath表达式将查找ImageView
节点的任何地方文档中。要将其限制为仅顶级节点的子LinearLayout
节点,请/LinearLayout/ImageView
改用。
该-v "5dip"
命令中给出该属性的新值。
严格来说,问题是
我希望能够通过其ID获得xml元素[...]
即,不知道节点的名称。为此,只需ImageView
将XPath表达式更改为*
。这样,您将更新与给定字符串匹配的所有节点android:id
。
有关的:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句