Javascript 读取Node.js中的XML文件
我正在学习如何使用Node。此时,我有一个如下所示的XML文件:Javascript 读取Node.js中的XML文件,javascript,xml,node.js,Javascript,Xml,Node.js,我正在学习如何使用Node。此时,我有一个如下所示的XML文件: {"type":"Buffer","data":[60,63,120, ...]} sitemap.xml <?xml version="1.0" encoding="utf-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
{"type":"Buffer","data":[60,63,120, ...]}
sitemap.xml
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>http://www.example.com</loc>
<lastmod>2015-10-01</lastmod>
<changefreq>monthly</changefreq>
</url>
<url>
<loc>http://www.example.com/about</loc>
<lastmod>2015-10-01</lastmod>
<changefreq>never</changefreq>
</url>
<url>
<loc>http://www.example.com/articles/tips-and-tricks</loc>
<lastmod>2015-10-01</lastmod>
<changefreq>never</changefreq>
<article:title>Tips and Tricks</blog:title>
<article:description>Learn some of the tips-and-tricks of the trade</article:description>
</url>
</urlset>
当执行console.log
语句时,我只在控制台窗口中看到一堆数字。大概是这样的:
{"type":"Buffer","data":[60,63,120, ...]}
我错过了什么?来自
回调传递了两个参数(err,data),其中data是
文件的内容
如果未指定编码,则返回原始缓冲区
如果选项是字符串,则指定编码。例如:
fs.readFile('/etc/passwd', 'utf8', callback);
您没有指定编码,因此获得原始缓冲区。fs.readFile有一个可选的第二个参数:encoding。如果不包含此参数,它将自动返回缓冲区对象 如果您知道编码,只需使用:
fs.readFile(__dirname + '/../public/sitemap.xml', 'utf8', function(err, data) {
if (!err) {
console.log(data);
}
});
为了,我喜欢这个。这个包让我可以轻松地使用JavaScript中的XML
var parser = new xml2js.Parser();
parser.parseString(fileData.substring(0, fileData.length), function (err, result) {
var json = JSON.stringify(result);
});
来晚了,在这里补充一个简单的提示, 如果您计划在js中使用解析数据或将其保存为json文件,请确保将
explicitArray
设置为false
。输出将更加友好
所以它看起来像,letparser=newxml2js.Parser({explicitArray:false})
参考:
使用xml2json
fs=require('fs');
var parser=require('xml2json');
fs.readFile('./data.xml',函数(err,data){
var json=parser.toJson(数据);
log(“to json->”,json);
});代码>您还可以在解析之前使用正则表达式删除与您的条件不匹配的元素:
var parser = new xml2js.Parser();
fs.readFile(__dirname + '/../public/sitemap.xml', "utf8",function(err, data) {
// handle err...
var re = new RegExp("<url>(?:(?!<article)[\\s\\S])*</url>", "gmi")
data = data.replace(re, ""); // remove node not containing article node
console.log(data);
//... parse data ...
});
var parser=new xml2js.parser();
fs.readFile(uuu dirname+'/../public/sitemap.xml',“utf8”,函数(err,data){
//处理错误。。。
var re=new RegExp(“(?:(?!您可以试试这个
npm install express-xml-bodyparser --save
在客户端:-
$scope.getResp = function(){
var posting = $http({
method: 'POST',
dataType: 'XML',
url: '/getResp/'+$scope.user.BindData,//other bind variable
data: $scope.project.XmlData,//xmlData passed by user
headers: {
"Content-Type" :'application/xml'
},
processData: true
});
posting.success(function(response){
$scope.resp1 = response;
});
};
在服务器端:-
xmlparser = require('express-xml-bodyparser');
app.use(xmlparser());
app.post('/getResp/:BindData', function(req, res,next){
var tid=req.params.BindData;
var reqs=req.rawBody;
console.log('Your XML '+reqs);
});
@Sandburg在一篇评论中提到了XMLJS
,它对我最有效(在这个问题被问到几年后)。我尝试的其他方法是:xml2json
,它需要一些我不想处理的Windows Sdk,而xml2js
没有提供足够简单的OTB方法来搜索属性
我必须从3个节点深的xml文件中提取一个特定属性,然后XMLJS
轻松地完成了这项工作
使用以下示例文件stats.xml
<stats>
<runs>
<latest date="2019-12-12" success="100" fail="2" />
<latest date="2019-12-11" success="99" fail="3" />
<latest date="2019-12-10" success="102" fail="0" />
<latest date="2019-12-09" success="102" fail="0" />
</runs>
</stats>
步骤1 npm安装xml2js——保存
const xml2js = require('xml2js');
const fs = require('fs');
const parser = new xml2js.Parser({ attrkey: "ATTR" });
// this example reads the file synchronously
// you can read it asynchronously also
let xml_string = fs.readFileSync("data.xml", "utf8");
parser.parseString(xml_string, function(error, result) {
if(error === null) {
console.log(result);
}
else {
console.log(error);
}
});对于express服务器:
app.get('/api/rss/', (_request: Request, response: Response) => {
const rssFile = fs.readFileSync(__dirname + '/rssFeeds/guardian.xml', { encoding: 'utf8' })
console.log('FILE', rssFile)
response.set('Content-Type', 'text/xml')
response.send(rssFile)
})
- 接受请求
- 读取文件
- 设置xml头
- 返回文件
这个模块太有限了……无法处理嵌套的节点,并且在数组中返回具有相同标记的节点,而不管它们的顺序如何……WTF?对于所有研究XML到JSON转换的人来说,这是一个小小的提醒:xml2json库确实比xml2js更适合我。另一个库,如XMLJS
能够转换n两个方向。不是在什么时候需要它。因为javascript的内部表示在这样的库中总是特定的。(xml->javascript->property json)值得注意的是,parse.toJson(数据)
返回一个json字符串。如果您想访问parse.toJson(数据)的结果
作为一个Javascript对象,您需要通过调用JSON.parse
const JSON=JSON.parse(parser.toJson(data));
为您提供一个基本对象,以便您可以执行console.log(JSON.myPropertyKey)
。从未使用过您的解析器
变量?解析器变量来自原始问题,我不知道如何从他们的代码中使用。已删除。我花了一些时间尝试将xml转换为字符串,但这是更好的选择。或者使用readFileSync()< /代码>将其转换为JSON的其他原因吗?使用XMLDOM,XPath用于节点,因为您知道它是XML,并且可以使用XPath,这是另一个需要考虑的路径。
const xml2js = require('xml2js');
const fs = require('fs');
const parser = new xml2js.Parser({ attrkey: "ATTR" });
// this example reads the file synchronously
// you can read it asynchronously also
let xml_string = fs.readFileSync("data.xml", "utf8");
parser.parseString(xml_string, function(error, result) {
if(error === null) {
console.log(result);
}
else {
console.log(error);
}
app.get('/api/rss/', (_request: Request, response: Response) => {
const rssFile = fs.readFileSync(__dirname + '/rssFeeds/guardian.xml', { encoding: 'utf8' })
console.log('FILE', rssFile)
response.set('Content-Type', 'text/xml')
response.send(rssFile)
})