解析XML到js数据,如何访问特定标记?

时间:2016-03-18 00:07:00

标签: javascript xml parsing dom d3.js

情况

对于数据库分析工具,我需要将一堆生成的XML文件(hibernate反向工程XML文件)解析为javascript以进行可视化。由于我对javascript是一名java开发人员非常陌生,我试图一次采取一些小步骤。最终我想将xml文件解析为d3.js强制布局图,但这对我来说是个桥梁。

重现

给出以下html文件:

<!DOCTYPE html>
<meta charset="utf-8">
<script src="//d3js.org/d3.v3.min.js"></script>
<script src=d3-queue.js></script>
<script>

var q = d3_queue.queue();

// TODO 1: for each xml in folder xyz ... defer(d3.xml, "dynamicvalue", "application/xml") instead of hard coded
    .defer(d3.xml, "Actor.hbm.xml", "application/xml")
    .defer(d3.xml, "Film.hbm.xml", "application/xml")
    .defer(d3.xml, "Category.hbm.xml", "application/xml")
    .await(analyze);   

// obviously the function parameter need to be dynamic and not hard coded actor, film, category...
function analyze(error, actor,film,category) {
// TODO 2: for each read xml do ...

  if (error) throw error;
  console.log(category)
  console.log("XML Root Tag Name: " + category.documentElement.tagName)
  console.log("Checking Child Nodes: " + category.documentElement.childNodes[0].hasChildNodes)
  console.log("First Child: " + category.documentElement.childNodes[1].firstChild.tagName)
  console.log("Node Value: " + category.documentElement.childNodes[0].attributes.getNamedItem("id").nodeValue)      

}
</script>

并给出以下示例.xml文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 15-mrt-2016 20:29:28 by Hibernate Tools 3.2.2.GA -->
<hibernate-mapping>
    <class name="nl.sander.mieras.localhost.sakila.Category" table="category" catalog="sakila">
        <id name="categoryId" type="java.lang.Byte">
            <column name="category_id" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="name" length="25" not-null="true" />
        </property>
        <property name="lastUpdate" type="timestamp">
            <column name="last_update" length="0" not-null="true" />
        </property>
        <set name="filmCategories" inverse="true">
            <key>
                <column name="category_id" not-null="true" />
            </key>
            <one-to-many class="nl.sander.mieras.localhost.sakila.FilmCategory" />
        </set>
    </class>
</hibernate-mapping>

问题

如何动态从表名中读取值(此处为:“category”)并将其保存到var节点?

我一直坚持将xml解析为正确的js数据已经有一段时间了,所以任何正确方向的推动都会很棒。

研究

我已尝试过http://www.hiteshagrawal.com/javascript/javascript-parsing-xml-in-javascript/中的示例,但我没有得到预期的结果。那些预期的结果将是子节点类似<id name="categoryId" type="java.lang.Byte">

此外,我在@ How to import XML data using d3.js?问题上基于@Lars Grammel给出的答案进行了广泛的尝试。即使链接和答案很棒,我也无法让它适用于我的情况(不够专业知识)

第一个“结束”目标是创建一个强制布局,将所有表名称作为节点(还没有链接,链接最终将是一对多和多对一映射),如图所示在https://bl.ocks.org/mbostock/1080941

1 个答案:

答案 0 :(得分:1)

您想读出“table” - 属性的值吗?

你可以这样做jQuery例如:

$.get("some.xml", function(d){
    console.log($(d).find("class").attr("table"));
});

这将推出:“类别”