【问题标题】:extract value from XML in pure JavaScript在纯 JavaScript 中从 XML 中提取值
【发布时间】:2015-03-18 09:25:18
【问题描述】:

我正在使用

从外部工具获取 XML 响应
var myXML = api.path("item/"+itemId+"/metadata").dataType("xml").get();

我以这种方式收到的 XML 结构如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MetadataListDocument xmlns="http://xml.vidispine.com/schema/vidispine">
  <item id="VX-3594">
    <metadata>
      <revision>VX-61522,VX-61520,VX-61519,VX-61515,VX-61513,VX-61514,VX-61525,VX-61523</revision>
      <group>Final Cut Server</group>
      <timespan start="-INF" end="+INF">
        <field uuid="2913190d-635c-4f81-951c-4ff3f934a547" user="system" timestamp="2015-03-16T16:52:48.061+01:00" change="VX-61523">
          <name>shapeTag</name>
          <value uuid="2c8b57d0-5c47-49c9-a4f0-54f7fef803cc" user="system" timestamp="2015-03-16T16:52:48.061+01:00" change="VX-61523">lowres</value>
          <value uuid="6d994b0c-9d91-4b32-8052-824b3467a29e" user="system" timestamp="2015-03-16T16:52:48.061+01:00" change="VX-61523">original</value>
          <value uuid="85cd07b7-6f13-4f6c-86fa-e42db20860c0" user="system" timestamp="2015-03-16T16:52:48.061+01:00" change="VX-61523">house_format_audio_through</value>
        </field>
        <field uuid="e2b4ca3c-6765-4890-99f4-f6e0624099eb" user="admin" timestamp="2015-03-16T16:47:57.506+01:00" change="VX-61513">
          <name>portal_mf129489</name>
          <value uuid="ab60ed17-75f4-4593-b068-9d8b6a700025" user="admin" timestamp="2015-03-16T16:47:57.506+01:00" change="VX-61513">no</value>
        </field>
      </timespan>
    </metadata>
  </item>
</MetadataListDocument>

现在我需要提取名称为portal_mf129489 的字段的值,在本例中为no

为了从 xml 输出中提取数据,我已经设置了默认名称空间:

default xml namespace = "http://xml.vidispine.com/schema/vidispine";

我可以使用

 var myTimespan = myXML.item.metadata.timespan;

不过,我的问题是,我怎样才能找到一个 field 元素,它有一个名为 portal_mf129489 的子元素?如果我找到这个元素,我需要获取名为 value 的字段的子元素的值。

每个 XML 都有多个字段元素,在我要查找的字段内,name 始终是第一个子元素,value 始终是第二个元素。

有什么想法吗?

【问题讨论】:

    标签: javascript xml xml-parsing


    【解决方案1】:

    你可以在 jQuery 的帮助下做到这一点。思路是用jQuery查询XML文档:

    var xml = $.parseXML('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><MetadataListDocument xmlns="http://xml.vidispine.com/schema/vidispine"><item id="VX-3594"><metadata><revision>VX-61522,VX-61520,VX-61519,VX-61515,VX-61513,VX-61514,VX-61525,VX-61523</revision><group>Final Cut Server</group><timespan start="-INF" end="+INF"><field uuid="2913190d-635c-4f81-951c-4ff3f934a547" user="system" timestamp="2015-03-16T16:52:48.061+01:00" change="VX-61523"><name>shapeTag</name><value uuid="2c8b57d0-5c47-49c9-a4f0-54f7fef803cc" user="system" timestamp="2015-03-16T16:52:48.061+01:00" change="VX-61523">lowres</value><value uuid="6d994b0c-9d91-4b32-8052-824b3467a29e" user="system" timestamp="2015-03-16T16:52:48.061+01:00" change="VX-61523">original</value><value uuid="85cd07b7-6f13-4f6c-86fa-e42db20860c0" user="system" timestamp="2015-03-16T16:52:48.061+01:00" change="VX-61523">house_format_audio_through</value></field><field uuid="e2b4ca3c-6765-4890-99f4-f6e0624099eb" user="admin" timestamp="2015-03-16T16:47:57.506+01:00" change="VX-61513"><name>portal_mf129489</name><value uuid="ab60ed17-75f4-4593-b068-9d8b6a700025" user="admin" timestamp="2015-03-16T16:47:57.506+01:00" change="VX-61513">no</value></field></timespan></metadata></item></MetadataListDocument>');
    
    var value = $(xml).find('field > name').filter(function(){ return $(this).text() === 'portal_mf129489' }).siblings('value').text();
    
    $('body').append(value);
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 非常感谢您的建议。我的错误:我忘了提到我不能使用任何外部库。这是一个封闭的系统,它做一些后端工作,可以由 JavaScript 代码触发。我更新了标题以反映我需要一个“纯”JavaScript 解决方案。对此感到抱歉。
    【解决方案2】:

    好的,现在开始工作了。我添加了函数:

    function getField(ts, name) {
      for (var i = 0; i < ts.field.length(); i++) {
        var f = ts.field[i];
        if (f.name == name) {
          return f;
        }
      }
    }
    

    还有这个:

    var r = api.path("item/"+itemId+"/metadata").dataType("xml").get();
    var metadata = r.item[0].metadata;
    var ts = metadata.timespan[0];
    var tag = getField(ts, 'portal_mf129489');
    if (tag && tag.value) {
      logger.log('value: '+tag.value[0]);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多