Javascript 在属性名中搜索带冒号的xpath表达式会引发异常(node.js elementtree模块)

Javascript 在属性名中搜索带冒号的xpath表达式会引发异常(node.js elementtree模块),javascript,node.js,xpath,elementtree,Javascript,Node.js,Xpath,Elementtree,使用nodejs中的elementtree包,我试图验证xml文件(特别是android清单文件)中是否存在某个xml属性 我得到以下异常: node_modules/elementtree/lib/elementpath.js:210 throw new SyntaxError(token, 'Invalid attribute predicate'); ^ Error: Invalid attribute predicate 它似乎不喜欢属性名称中的冒号,但如果

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

我得到以下异常:

node_modules/elementtree/lib/elementpath.js:210
      throw new SyntaxError(token, 'Invalid attribute predicate');
        ^
Error: Invalid attribute predicate
它似乎不喜欢属性名称中的冒号,但如果没有冒号,搜索将不匹配。我认为我处理名称空间是错误的——但找不到正确的方法

编辑以下是我正在搜索的示例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>


;

;

;

Elementtree需要名称空间URI,而不是名称空间前缀

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

test.ok( manifestDoc.find(expected) );
见:


Edit的XPath实现似乎根本没有名称空间支持

错过了你必须做一些腿部工作:

var manifestTxt = fs.readFileSync('AndroidManifest.xml', 'utf-8'),
    manifestDoc = new et.ElementTree(et.XML(manifestTxt)),
    activities = manifestDoc.findall('//application/activity'), i;

for (i=0; i<activities.length; i++) {
  if ( activities[i].attrib['android:name'] === 'com.whatever.app' ) {
    test.ok(true);
  }
}
var manifestTxt=fs.readFileSync('AndroidManifest.xml','utf-8'),
manifestDoc=new et.ElementTree(et.XML(manifestTxt)),
activities=manifestDoc.findall('//application/activity'),i;

对于(i=0;i,如果您不知道如何注册名称空间并为其使用相关前缀,请使用:

application/activity
   [@*[local-name()=name' 
     and 
      namespace-uri() = 'http://schemas.android.com/apk/res/android'
      ] 
   = 
    'com.whatever.app'
   ]
application/activity[@*[local-name()='name'] = 'com.whatever.app']
application/activity[@*[name()='android:name'] = 'com.whatever.app']
在一般情况下不安全,但在此特定情况下可能选择所需节点的更简单表达式

application/activity
   [@*[local-name()=name' 
     and 
      namespace-uri() = 'http://schemas.android.com/apk/res/android'
      ] 
   = 
    'com.whatever.app'
   ]
application/activity[@*[local-name()='name'] = 'com.whatever.app']
application/activity[@*[name()='android:name'] = 'com.whatever.app']
或此表达式

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

您尝试过对冒号进行转义吗?
\:
?谢谢,我确实尝试过,虽然它不再抛出异常,但查找失败(因此我认为它也是错误的)。我添加了我正在搜索的示例xml。因此问题变成了,为什么查找失败?@DimitreNovatchev是的。无论如何,根据文档,ElementTree就是这样工作的(请参阅上面的“使用限定名称”链接)。我对此无能为力。@wildabeast看,我没有看到任何迹象表明node elementtree甚至有名称空间支持。XPath实现非常基本。也没有函数支持。你能确认这是你正在使用的版本吗?这是我正在使用的版本,是的。所以你可能对缺少n的说法是正确的空间支持,谢谢。