【问题标题】:Finding the value of an xml element with a given attribute value with JavaScript only [duplicate]仅使用 JavaScript 查找具有给定属性值的 xml 元素的值 [重复]
【发布时间】:2013-10-01 20:26:55
【问题描述】:

我有一个 xml 字符串,我需要从仅使用 JavaScript 中提取一个值。以下是 xml 字符串的示例:

<RequestVars>
    <BuyerCookie>O7CPHFP7AOY</BuyerCookie>
    <Extrinsic name="CostCenter">670</Extrinsic>
    <Extrinsic name="UniqueName">catalog_tester</Extrinsic>
    <Extrinsic name="UserEmail">catalog_tester@mailinator.com</Extrinsic>
</RequestVars>

我需要从中获取电子邮件地址(即 catalog_tester@mailinator.com)。我有一种方法可以提取给定唯一元素的值,例如使用此函数为 BuyerCookie 获取 O7CPHFP7AOY:

function elementValue(xml, elem) {
    var begidx;
    var endidx;
    var retStr;

    begidx = xml.indexOf(elem);
    if (begidx > 0) {
        endidx = xml.indexOf('</', begidx);
        if (endidx > 0)
            retStr = xml.slice(begidx + elem.length,
 endidx);
        return retStr;
    }
    return null;
}

但是现在,我需要一种方法来查找“Extrinsic”元素的值,属性“name”的值为“UserEmail”。我已经看到了几种在 JQuery 中完成此任务的方法,但在 JavaScript 中却没有。不幸的是,出于我的目的,我只能使用 JavaScript。有什么想法吗?

【问题讨论】:

  • 不,这似乎没有帮助
  • 不要将 XML 解析为字符串。永远。

标签: javascript xml parsing


【解决方案1】:

我想出了一个解决方案。这有点混乱,但它确实很棘手。我输入了 xml 的字符串表示形式、我正在寻找的元素标记的名称、属性的名称和我正在寻找的元素值的属性值。

function elementValueByAttribute(xml, elem, attrName, attrValue) {
    var startingAt = 1;
    var begidx;
    var mid1idx;
    var mid2idx;
    var endidx;
    var aName;
    var retStr;
    var keepGoingFlag = 1;

    var count = 0;
    while (keepGoingFlag > 0) {
        count++;
        begidx = xml.indexOf(elem, startingAt);
        if (begidx > 0) {
            mid1idx = xml.indexOf(attrName, begidx);
            if (mid1idx > 0) {
                mid2idx = xml.indexOf(">", mid1idx);
                if (mid2idx > 0) {
                    aName = xml.slice(mid1idx + attrName.length + 2, mid2idx - 1);
                    if (aName == attrValue) {
                        endidx = xml.indexOf('</', begidx);
                        if (endidx > 0)
                        {
                            retStr = xml.slice(mid2idx + 1, endidx);
                        }
                        return retStr;
                    }
                }
            }
        }
        if (startingAt == mid2idx) {
            keepGoingFlag = 0;
        } else {
            startingAt = mid2idx;
        }
    }
    return null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2012-07-22
    • 2013-02-04
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多