如何根据属性获取XML父标记的子节点

时间:2016-03-03 13:10:47

标签: javascript xml

我一直在尝试使用JS

基于属性类型显示父节点的所有子节点

要求:

用户提供三个I / P:

1)"拉姆" "学生" " A1"

O / P:应根据名称和&amp ;;显示所有子元素选择类型

AAA,AAAAAAAA,AAAA

2)"拉姆" "学生" " A2" :

XXXX,TTTTTT,YYYY

XML:

<?xml version="1.0" ?>
<root>
    <program name="Ram">
        <computation type="student">
            <module type="a1">              
                <modPath>aaa</modPath>
                <modInputTemplate>aaaaaaaa</modInputTemplate>
                <modSchematic>aaaa</modSchematic>
            </module>
            <module type="a2">              
                <modPath>xxxx</modPath>
                <modInputTemplate>tttttt</modInputTemplate>
                <modSchematic>yyyy</modSchematic>
            </module>
        </computation>
        <computation type="Employee">
            <module type="b1">              
                <modPath>lllll</modPath>
                <modInputTemplate>llllll</modInputTemplate>
                <modSchematic>lllll</modSchematic>
            </module>
            <module type="b2">              
                <modPath>mmmmmmmmm</modPath>
                <modInputTemplate>mmmmmmmm</modInputTemplate>
                <modSchematic>mmmmmm</modSchematic>
            </module>
        </computation>      
    </program>
    <program name="Rahul">
    .......
    .......
    .......
    </program>
    <program name="Ramesh">
    .......
    .......
    .......
    </program>
</root>

我有JS来显示Child节点,但它不是基于属性值

    <html>
<head>
<title>Read XML in Microsoft Browsers</title>
<script type="text/javascript">
    var xmlDoc;
    function loadxml()
    {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = false;
        xmlDoc.onreadystatechange = readXML;
        xmlDoc.load("writers.xml");
    }


    function readXML()
    {
        if(xmlDoc.readyState == 4){
            myFunction(xmlDoc);
        }
        function myFunction(xml) {
            var x, i, txt;
            txt = "";

            var x = xmlDoc.getElementsByTagName("module");//Here "module" should be replaced by attribute value which user gives as i/p

            for( i = 0; i < x[0].childNodes.length; i++) {
                txt += x[0].childNodes[i].nodeName + ": " + x[0].childNodes[i].childNodes[0].nodeValue + "<br>";
            }
            document.getElementById("demo").innerHTML = txt;
        }
    }
</script>
</head>

<body onload="loadxml()">
    <p id="demo">Write output of loadxml()</p>
    <p id="test">Test me!</p>
</body>

</html>

2 个答案:

答案 0 :(得分:0)

您所要做的就是检查所需的属性。

您的代码返回了一系列模块:

var x = xmlDoc.getElementsByTagName("module");

您要做的最后一件事是浏览节点并仅选择具有所需属性的节点:

// x is the array of modules, i stands for the array iteration    
x[i].getAttribute(name);

现在,您可以将所需的输入与搜索算法相结合。 既然你有孩子的Childnodes它可能会有点慢。你将永远经历:

Parent -> Child.getAttribute -> new array -> Child.getAttribute.

您要做的最后一件事是使用正常的if语句检查输入,这取决于您的输入有多复杂。

如果有任何不清楚的地方,请随时提出。

此致,Megajin

答案 1 :(得分:0)

您可以使用XPath使用复杂的过滤器来定位XML文档的一部分。下面的示例显示了XPath表达式,该表达式将返回module的所有子元素,其中typename属性及其祖先匹配特定值:

var result = "";

var name = "Ram";
var type1 = "student";
var type2 = "a2";
var query = "/root/program[@name='" + name + "']/computation[@type='" + type1 + "']/module[@type='" + type2 + "']/*";

var nodes = xmlDoc.selectNodes(query);
for (i = 0; i < nodes.length; i++) {
    var node = nodes[i];
    result += node.nodeName + ": " + node.childNodes[0].nodeValue + "<br>";
}

document.getElementById("demo").innerHTML = result;

在IE11上测试并在点击&#34;允许被阻止的内容&#34; 提示后显示预期的输出:

enter image description here

输出:

enter image description here