如何访问 xml 提要上的属性

Posted

技术标签:

【中文标题】如何访问 xml 提要上的属性【英文标题】:How to access attributes on xml feed 【发布时间】:2018-10-18 19:36:26 【问题描述】:

我正在尝试从我的 React JS 应用程序中的 xml 文件中解析数据,但它似乎返回了一个包含 25 个左右“立方体”元素的完整 xml 对象。我有兴趣访问每个多维数据集的“货币”和“汇率”属性,并在下拉列表中输出这些属性。有没有办法遍历所有的立方体并以某种方式定位它们?我正在尝试构建一个自动转换用户输入的价格的货币转换器。

我的代码:

import React,  Component  from 'react';
import "../../App.css"

class Countries extends Component 
    constructor() 
        super();
        this.state = 
            countrycodes: [],
            exchangerates: []
        ;
    


componentDidMount()
    fetch('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml')
        .then(response => response.text())
        .then(str => (new window.DOMParser()).parseFromString(str, "text/xml"))
        .then(data => 
            const cubes = data.getElementsByTagName("Cube")
            for( const element of cubes) 
                if (!element.getAttribute('currency')) 
                    continue;
                

                let countrycodes = element.getAttribute('currency')
                let exchangerates = element.getAttribute('rate')
                this.setState(
                    countrycodes: countrycodes,
                    exchangerates: exchangerates
                )                                
            
        );       
    


render() 
    return (

        <div className="container2">
            <div className="container1">
                <select>this.state.countrycodes.map((country) => 
                    <option>country</option>)                                            
                
                </select>
            </div>
        </div>
    )
    


export default Countries;

谢谢,

罗伯特

【问题讨论】:

您想使用哪种方法来访问属性,您要 onClick 还是 onChange? 这是下拉选择吗? 我只想通过任何可能的方式访问它们! 【参考方案1】:

使用getAttribute:

class Countries extends React.Component 
    constructor() 
        super();
        this.state = 
            countryCodes: []
        ;
    


  componentDidMount()
    fetch(url: 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml')
        .then(response => response.text())
        .then(str => (new window.DOMParser()).parseFromString(str, "text/xml"))
        .then(data => 
            const countryCodes = [];
            const cubes = data.getElementsByTagName("Cube");
            for (const element of cubes) 
                if (!element.getAttribute('currency')) 
                    // skip cube with no currency
                    continue;
                
                countryCodes.push( 
                    currency:element.getAttribute('currency'),
                    rate: element.getAttribute('rate')
                );
            
            this.setState(countryCodes);
       );
    

  render() 

    const options = this.state.countryCodes.map(
        (currency, rate) => (<option value=rate>currency - rate</option>));
    return (
        <div className="container2">
            <div className="container1">
                <select>
                  options
                </select>
            </div>
        </div>
    )
  

要检查您可以直接在浏览器的控制台中打开http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml 并运行fetch(...)

【讨论】:

嗨,Alex,谢谢,但我收到一条错误消息,提示“立方体”不能以这种方式迭代:未处理的拒绝 (TypeError):立方体 [Symbol.iterator] 不是函数。也许是因为我试图迭代一个对象? :) 可能与浏览器有关。但是,在我的示例中,最后没有[0]const cubes = data.getElementsByTagName("Cube");,您使用的是我写的吗? 谢谢,它成功了——我现在有了来自提要的数据!谢谢你,你是个天才! 嗨,Alex,对于额外的奖励积分,您知道如何在下拉列表中输出每个“货币”和“汇率”属性吗?我试图通过将“货币”和“汇率”列表设置为状态的属性,以某种方式在我的组件的渲染方法中实现这一点。我当前的代码如下(见上面编辑过的问题): @RobertYoung 是的,已更新。我会在state 中存储currencies - rates 的数组,在render 中存储map 状态。

以上是关于如何访问 xml 提要上的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nokogiri 访问属性

具有多个连接/提要/视图的 XML 解析的设计/实施建议

如何让 findViewById 动态获取 XML 上的 id 属性(Android)?

如何通过 ApplicationContext 访问属性

如何获取 RSS 提要上的所有旧项目?

如何在情节提要中将属性 tableView 连接到 UITableView