React-Native 获取 XML 数据

Posted

技术标签:

【中文标题】React-Native 获取 XML 数据【英文标题】:React-Native fetch XML data 【发布时间】:2015-06-30 14:11:38 【问题描述】:

我是 React-Native 的新手。尝试制作一些非常简单的应用程序。无法弄清楚如何获取 XML 数据。使用 JSON,一切都变得清晰而简单。

但是如何获取 XML?尝试通过this 和其他一些类似的脚本将其转换为 JSON,但没有任何成功。需要帮助:/

我的代码看起来很简单:

var xml_url = 'http://api.example.com/public/all.xml';

var ExampleProject = React.createClass(
    getInitialState: function() 
    return 
      data: results:,
    ;
  ,
  componentDidMount: function() 
    this.fetchData();
  ,
  fetchData: function() 
    fetch(xml_url)
      .then((response) => response.json())
      .then((responseData) => 
        this.setState(
          data: responseData.data,
        );
      )
      .done();
  ,

  render: function() 
    return (
      <View style=styles.wrapper>
        <View style=styles.container>
          <View style=styles.box>
            <Text style=styles.heading>Heading</Text>
            <Text>Some text</Text>
          </View>
        </View>
      </View>
    );
  ,
);

【问题讨论】:

尝试使用response.text() 对此有任何答案吗?我遇到了同样的问题。那里没有纯 JS XML 解析器吗? 【参考方案1】:

看起来您无法取回 XML,但您可以获取原始文本;使用response.text() 而不是response.json()。您仍然需要将文本处理为 xml

【讨论】:

是的,response.text() 工作正常,但是文本到 xml 的过程存在问题。例如,来自these 答案的所有解决方案都返回 null 或错误 :( 在使用新的 DOMParser() 时,我还有“找不到变量:DOMParser()”;【参考方案2】:

你可以使用npm install xmldom,现在加载DOMParser如下:

var DOMParser = require('xmldom').DOMParser

我将它用于我的项目。

【讨论】:

有没有人尝试在 React Native 中专门使用 xmldom? 我在我的演示项目中使用它。可以参考demogithub.com/kaich/ASReact/blob/master/App/Main/TypePage.js 安卓和ios都支持吗? @LawGimenez 今天我刚刚使用 xmldom 来处理 RSS 提要。我仍处于早期阶段,但它似乎适用于 iOS 和 android【参考方案3】:

首先 - React Native 使用 javascriptCore,它只是一个 javascript 解释器,所以没有浏览器对象模型、没有文档对象、没有窗口等。这就是为什么你不能使用 DOMParser 的原因。

React 确实为您提供了一个 XMLHttpRequest 包装器,但它不包括 responseXML

我没有找到任何解决方案,所以我刚刚为此创建了自己的库:react-native-xml,它允许您解析 xml 并对其进行 XPath 查询:

let xml = require('NativeModules').RNMXml
xml.find('<doc a="V1">V2</doc>', 
         ['/doc/@a', '/doc'], 
          results => results.map(nodes => console.log(nodes[0]))) 
// Output: 
//  V1 
//  V2 

【讨论】:

非常漂亮的解决方案,但它似乎不支持Android。所以你仍然会遇到同样的问题。【参考方案4】:

我花了几个小时才发现我可以这样做:

const GOOGLE_FEED_API_URL = "https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=-1&q="
let url = GOOGLE_FEED_API_URL + encodeURIComponent(<yoururl>);

fetch(url).then((res) => res.json());

希望对你有帮助!

【讨论】:

这怎么被赞成了?它回答了一个完全不同的问题。如何将 URL 作为 get 参数发送。 我认为它是使用 Google 服务将 XML 文件转换为 JSON...【参考方案5】:

我正在使用 react-native,但我并不是很喜欢 xmldom。 我编写了自己的 react-native XML 解析器。 你可以检查一下 https://www.npmjs.com/package/react-xml-parser

【讨论】:

【参考方案6】:

你可以试试https://github.com/connected-lab/react-native-xml2js,

    const parseString = require('react-native-xml2js').parseString;

    fetch('link')
        .then(response => response.text())
        .then((response) => 
            parseString(response, function (err, result) 
                console.log(response)
            );
        ).catch((err) => 
            console.log('fetch', err)
        )

我将它用于我的项目。

【讨论】:

截至 2019 年 2 月,这个答案似乎仍然是最相关的。您可能希望切换到 ES6 导入语法,但要跟上当前的约定: import parseString from "react-native-xml2js"; newb 问题,在 npm install react-native-xml2js 之后,我得到“找不到模块:无法解析 '/Users/me/firsttry/src/components 中的 'react-native-xml2js' '" 当我使用该导入时。【参考方案7】:

我使用了 2 个包的组合。在我的用例中,我必须解析 SOAP 请求的响应:

第一个包是-React Native XML2JS 使用它而不是XML2JS 的原因是我收到了React Native not supporting node standard library 的错误。 (我也在使用 expo。)

我实际用于解析的第二个包是-XML-JS。我不得不使用第一个包,因为我遇到了 React Native 不支持节点标准库的相同错误。我之所以使用它,是因为它可以在大型 XML 响应的情况下提供更结构化的结果。

【讨论】:

【参考方案8】:

这是一个使用 xml2js 的工作示例:

• responseText 是从 example.xml 获取的 .XML 数据

• 在 .then((responseText) = ) 的花括号内添加了 xml2json 脚本以将 .xml 数据解析为 Json 格式 console.log(result) 将在终端中呈现 json 格式。

旁注:如果您删除解析字符串并添加 console.log(responseText),则输出将是 XML 格式。

    import React, Component from 'react';
    import View from 'react-native';
    import parseString from 'xml2js'



    class App extends Component 


     componentDidMount()
      this._isMounted = true;
      var url = "https://example.xml"
      fetch(url)
        .then((response) => response.text())
        .then((responseText) => 
       parseString(responseText, function (err, result) 
         console.log(result);
         return result;
        );
      this.setState(
        datasource : result
        )
       )
    .catch((error) => 
      console.log('Error fetching the feed: ', error);
    );
  



      componentWillUnMount() 
         this._isMounted = false;
      




      render()
        return(
          <View>

          </View>

        )
      
    

    export default App;

【讨论】:

【参考方案9】:
const parseString = require('react-native-xml2js').parseString;

fetch('link')
    .then(response => response.text())
    .then((response) => 
        parseString(response, function (err, result) 
            console.log(response)
        );
    ).catch((err) => 
        console.log('fetch', err)
    )

【讨论】:

以上是关于React-Native 获取 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章

React-native:检测开发或生产环境

console.log 不适用于 react-native

开始学习react-native(零)

为啥 npm install react-native 不起作用?

react-native + react-native-tab-navigator 实现 TabBar

如何在 react-native 应用程序中更改 android 的键盘主题?