React-Native 获取 XML 数据

问题描述 投票:0回答:9

我是 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>
    );
  },
});
javascript xml json reactjs react-native
9个回答
18
投票

你可以尝试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)
        })

我将它用于我的项目。


5
投票

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

var DOMParser = require('xmldom').DOMParser

我将它用于我的项目。


2
投票

首先 - 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 

1
投票

看起来你无法取回 XML,但你可以获取原始文本;使用

response.text()
代替
response.json()
。您仍然需要将文本处理为 xml


1
投票

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


0
投票

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

第一个包是 - React Native XML2JS 使用它而不是 XML2JS 的原因是我收到了 React Native 不支持节点标准库 的错误。 (我也在使用expo。)

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


0
投票
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)
    })

0
投票

这是一个使用 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;


-1
投票

我遇到了同样的问题,花了几个小时才发现我可以这样做:

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());

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.