Javascript 读取Node.js中的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"

我正在学习如何使用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"   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)
  })