存在命名空间指令时,错误解析xml

问题描述

我需要使用node.js读取多个XML文件。当根节点包含名称空间指令时,解析xml文件失败。删除名称空间指令时,所有指令都可以正常运行。我所有的文件都可以有不同的声明。如何解析XML,而忽略名称空间属性?我需要使用xPath来获取一些值。

我正在使用...

var fs = require('fs');
var xpath = require('xpath');
var dom   = require('xmldom').DOMParser;

var xml = fs.readFileSync('/test.xml','utf8').toString();
var doc = new dom().parseFromString(xml);
var id = xpath.select("/export/asset/id",doc);

console.log(id[0].firstChild.data);

XML文件

<export xmlns="some url" xmlns:xsi="some url" format="archive" version="2.4" xsi:schemaLocation="some url.xsd">
  <asset>
    <id>1445254514291</id>
    <name>test</name>
    <displayName />
    <origin>demo</origin>
  </asset>
<export>

解决方法

通常来说,考虑名称空间是可取的,但是如果您必须处理太多的名称空间,则要完全避免使用它们,一种避免使用名称空间的方法是使用xpath和有些复杂但有效的local-name()函数。

所以我会改变

var id = xpath.select("/export/asset/id",doc);

var id = xpath.select("//*[local-name()='export']//*[local-name()='asset']//*[local-name()='id']",doc);

在问题中带有示例xml的情况下,应输出:

"1445254514291"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...