在属性名称中使用冒号搜索xpath表达式会引发异常(node.js elementtree module)

wil*_*ast 3 javascript xpath elementtree node.js

使用nodejs中的elementtree包,我试图验证xml文件(特别是android清单文件)中是否存在某个xml属性.

var manifestTxt = fs.readFileSync('AndroidManifest.xml', 'utf-8'),
    manifestDoc = new et.ElementTree(et.XML(manifestTxt)),
    expected = 'application/activity[@android:name="com.whatever.app"]';

test.ok(manifestDoc.find(expected));
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

node_modules/elementtree/lib/elementpath.js:210
      throw new SyntaxError(token, 'Invalid attribute predicate');
        ^
Error: Invalid attribute predicate
Run Code Online (Sandbox Code Playgroud)

它似乎不喜欢属性名称中的冒号,但没有它,搜索不匹配.我认为我正在处理命名空间错误 - 但找不到正确的方法.

编辑这里是我正在搜索的示例xml:

<?xml version='1.0' encoding='utf-8'?>
<manifest ... xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:debuggable="true" android:icon="@drawable/icon" android:label="@string/app_name">&#xA; 
        <activity android:label="@string/app_name" android:name="com.whatever.app">&#xA;                
            <intent-filter>&#xA;</intent-filter>
        </activity> 
    </application>
    <uses-sdk android:minSdkVersion="5" />
</manifest>
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 8

如果您没有如何注册命名空间并使用相关前缀的信息,请使用:

application/activity
   [@*[local-name()=name' 
     and 
      namespace-uri() = 'http://schemas.android.com/apk/res/android'
      ] 
   = 
    'com.whatever.app'
   ]
Run Code Online (Sandbox Code Playgroud)

更简单的表达式在一般情况下不安全,但可以在这种特定情况下选择所需的节点:

application/activity[@*[local-name()='name'] = 'com.whatever.app']
Run Code Online (Sandbox Code Playgroud)

或者这个表达式:

application/activity[@*[name()='android:name'] = 'com.whatever.app']
Run Code Online (Sandbox Code Playgroud)