Ancy
Ancy

Reputation: 35

jquery xml find node with value

Hi friends I have below code in XML file. I need to find the value of <x> <metadata> <field><name>work</name><value> based on y tag value.

XML File

<x>
<y>12</y>
<metadata>
<field>
<name>1234</name>
<value>qqqqqq</value>
</field>
<field>
<name>work</name>
<value>true</value>
</field>
</metadata>
</X>
<x>
<y>14</y>
<metadata>
<field>
<name>5678</name>
<value>wwwww</value>
</field>
<field>
<name>work</name>
<value>false</value>
</field>
</metadata>
</X>

My code

y=14;
$.ajax({
        type: "GET" ,
        url: "../JRF/JRF.xml" ,
        dataType: "xml" ,
        success: function(xml) {

            $(xml).find('x').each(function(){
                if(y == $(this).find('y').text())
                {
                    ?????????
                }

            }); 
            }       
        });

Can u help me to get the value of <value> true or false and I have to store the value in a hidden input text box.

Upvotes: 1

Views: 3305

Answers (1)

acdcjunior
acdcjunior

Reputation: 135752

Here's something you can use:

$(xml).find('x').each(function() {
 if (y == $(this).find('y').text()) {
  var trueOrFalse = $(this).find('metadata field:has(name:contains("work")) value').text();
  console.log('work for ' + y + ' is ' + trueOrFalse);
 }
});

Basically, it:

  • $(xml).find('x').each(function() {
    • gets every x element in the XML
  • if (y == $(this).find('y').text()) {
    • if that x has an y child element whose text contents is equal to y
  • $(this).find('metadata field:has(name:contains("work")) value').text();
    • Breakdown:
      • $(this).find('metadata field')
        • it finds the field element that is child of a metadata element
      • $(this).find('metadata field:has(name:contains("work"))')
        • it limits only to those field that have a name child with "work" in its contents
      • $(this).find('metadata field:has(name:contains("work")) value').text();
        • and this selects the value element of the field:has(name:contains("work")), and gets its text.

Demo below.

var xml = `<root>
  <x>
    <y>12</y>
    <metadata>
      <field>
        <name>1234</name>
        <value>qqqqqq</value>
      </field>
      <field>
        <name>work</name>
        <value>true</value>
      </field>
    </metadata>
  </x>
  <x>
    <y>14</y>
    <metadata>
      <field>
        <name>5678</name>
        <value>wwwww</value>
      </field>
      <field>
        <name>work</name>
        <value>false</value>
      </field>
    </metadata>
  </x>
</root>
`;

var y = 14;
$(xml).find('x').each(function() {
 	if (y == $(this).find('y').text()) {
    var trueOrFalse = $(this).find('metadata field:has(name:contains("work")) value').text();
    console.log('work for ' + y + ' is ' + trueOrFalse);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

And, if you are into one-liners:

$(xml).find('x:has(y:contains("'+ y +'")) metadata field:has(name:contains("work")) value').text();

Demo:

var xml = `<root>
  <x>
    <y>12</y>
    <metadata>
      <field>
        <name>1234</name>
        <value>qqqqqq</value>
      </field>
      <field>
        <name>work</name>
        <value>true</value>
      </field>
    </metadata>
  </x>
  <x>
    <y>14</y>
    <metadata>
      <field>
        <name>5678</name>
        <value>wwwww</value>
      </field>
      <field>
        <name>work</name>
        <value>false</value>
      </field>
    </metadata>
  </x>
</root>
`;

var y = 14;
var trueOrFalse = $(xml).find('x:has(y:contains("'+ y +'")) metadata field:has(name:contains("work")) value').text();
console.log('work for ' + y + ' is ' + trueOrFalse);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Upvotes: 3

Related Questions