使用javascript进行Xml遍历

时间:2010-09-01 15:33:41

标签: javascript xml xslt

<links>
    <osname name="windows xp" links="xyz" />
    <osname name="windows 2k" links="xyz" />
</links>
<owners name="microsoft">
    <os name="windows xp" />
    <os name="windows 2k" />
    <os name="windows 2003" />
    <os name="windows 7" />
</owners>
<owners name="microsoft">
    <os name="windows xp" />
    <os name="windows 95" />
    <os name="windows 98" />
    <os name="windows vista" />
</owners>

的Javascript

它应该从links-&gt; osname获取链接并将其与所有者匹配 - &gt; os =&gt; name

和os名称只是一次,以后不再重复。

提前致谢

3 个答案:

答案 0 :(得分:1)

假设上面存储在变量txt中:

if (window.DOMParser) {
  parser=new DOMParser();
  xmlDoc=parser.parseFromString(txt,"text/xml");
} else {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async="false";
  xmlDoc.loadXML(txt); 
}

然后访问您在javascript中提供的XML:

// links.osname[0].attribute(name)
xmlDoc.childNodes[0].childNodes[0].getAttribute('name');
// outputs: windows xp

// owners.os[2].attribute(name)
xmlDoc.childNodes[1].childNodes[2].getAttribute('name');
// outputs: windows 2003

网上有很多代码解释了所有这些(另请参阅:getNamedItemgetElementsByTagNamenodeValue ......以及更多内容

遍历:

for(i=0;i<xmlDoc.childeNodes[1].childNodes.length;i++) {
  //Access each node in the set:
  xmlDoc.childNodes[1].childNodes[i]
}

答案 1 :(得分:1)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes"/>
    <xsl:key name="kOwnersByName" match="owners" use="@name"/>
    <xsl:key name="kOsByOwnerAndName" match="os" 
             use="concat(../@name,'+++',@name)"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="owners"/>
    <xsl:template match="owners[count(.|key('kOwnersByName',@name)[1])=1]">
        <xsl:variable name="vOwner" select="@name"/>
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:for-each select="../links/osname/@name">
                <xsl:apply-templates 
                 select="key('kOsByOwnerAndName',concat($vOwner,'+++',.))[1]"/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

正确输入:

<root>
    <links>
        <osname name="windows xp" links="xyz" />
        <osname name="windows 2k" links="xyz" />
    </links>
    <owners name="microsoft">
        <os name="windows xp" />
        <os name="windows 2k" />
        <os name="windows 2003" />
        <os name="windows 7" />
    </owners>
    <owners name="microsoft">
        <os name="windows xp" />
        <os name="windows 95" />
        <os name="windows 98" />
        <os name="windows vista" />
    </owners>
</root>

输出我认为你想要的东西:

<root>
    <links>
        <osname name="windows xp" links="xyz"></osname>
        <osname name="windows 2k" links="xyz"></osname>
    </links>
    <owners name="microsoft">
        <os name="windows xp"></os>
        <os name="windows 2k"></os>
    </owners>
</root>

答案 2 :(得分:1)

使用xml更方便的方法是使用 jQuery

只需检索数据:

$.ajax({ url: '/Document.xml', success: ProcessData, contentType: 'text/xml' });

并做任何你想做的事:

function ProcessData(data) {
    var xml = $(data);
    xml.find("links osname[name]").each(function () { 
        var value = $(this).attr("links")); 
        // etc.
    });
}

如果您了解jQuery,那对您来说应该很容易。