Обход XML с помощью JavaScript - PullRequest
1 голос
/ 01 сентября 2010
<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-> osname и сопоставить его с владельцами-> os => name

и имя os должно быть только один раз, оно не должно повторяться позже.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 02 сентября 2010

Эта таблица стилей:

<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>
1 голос
/ 02 сентября 2010

Более удобный способ работы с 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, это должно быть легкой задачей для вас.

1 голос
/ 01 сентября 2010

Предполагается, что вышеупомянутое хранится в переменной 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); 
}

И затем для доступа к XML, который вы предоставили в javascript:

// 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

Там довольно много кодасети, объясняющие все это (см. также: getNamedItem, getElementsByTagName, nodeValue ... и многое другое)

Для перемещения:

for(i=0;i<xmlDoc.childeNodes[1].childNodes.length;i++) {
  //Access each node in the set:
  xmlDoc.childNodes[1].childNodes[i]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...