PHP ile XML düğümleri bir alt alınıyor

4 Cevap php

PHP kullanarak, nasıl bir XML belgesinden düğümleri tüm bir alt kümesini alabilirim? Ben gibi bir şey alabilirsiniz:

<?xml version="1.0" encoding="utf-8"?>
<people>
  <certain>
    <name>Jane Doe</name>
    <age>21</age>
  </certain>
  <certain>
  <certain>
    <name>John Smith</name>
    <age>34</age>
  </certain>
</people>

Ama ben sadece bu gibi alt düğümler dönmek ne isterseniz?

  <certain>
    <name>Jane Doe</name>
    <age>21</age>
  </certain>
  <certain>
  <certain>
    <name>John Smith</name>
    <age>34</age>
  </certain>

EDIT: Ben XML bir alt kümesini almak ve SimpleXML gibi bir nesne, o değil doğrudan geçmek için çalışıyorum bana verecekti. Ben temelde anlamıyla XML yukarıdaki alt kümesi olduğu gibi ... hiçbir sözlü ya dönüştürerek veya yeni bir XML dosyası ya da bir şey yaratmak ... Sadece yerinde düğümler ayıklamak. NET'in OuterXml ... çıkmıyor ne yapacağını PHP almak için çalışıyorum ve onları geçmek. Ben, XML dosyasını almak ne gerek dışarı ayrıştırmak ve ardından yeni bir XML dosyası olarak yeniden inşa etmek zorunda mıyım? O halde ben <?xml version="1.0" encoding="utf-8"?> bit kurtulmak gerekiyorsa ... ugh.

4 Cevap

Cevap kullanmak olacaktır XPath.

$people = simplexml_load_string(
    '<?xml version="1.0" encoding="utf-8"?>
    <people>
      <certain>
        <name>Jane Doe</name>
        <age>21</age>
      </certain>
      <certain>
        <name>John Smith</name>
        <age>34</age>
      </certain>
    </people>'
);

// get all <certain/> nodes
$people->xpath('//certain');

// get all <certain/> nodes whose <name/> is "John Smith"
print_r($people->xpath('//certain[name = "John Smith"]'));

// get all <certain/> nodes whose <age/> child's value is greater than 21
print_r($people->xpath('//certain[age > 21]'));


Take 2

Yani görünüşe göre başka bir belgeye bazı düğümleri kopyalamak istediğiniz? Basit XML bu desteklemez. DOM Bunun için yöntemler var ama onlar tür can sıkıcı kullanmak demektir. Hangisini kullanıyorsunuz? İşte ne kullanın: SimpleDOM. Aslında, SimpleXML DOM yöntemleri ile artar gerçekten.

include 'SimpleDOM.php';
$results = simpledom_load_string('<results/>');

foreach ($people->xpath('//certain') as $certain)
{
    $results->appendChild($certain);
}

Bu rutin, XPath yoluyla tüm <certain/> düğüm bulur ardından yeni bir belge için onları ekler.

Sen kullanabilirsiniz DOMDocument.GetElementsByTagName or you could:

Use XPath?

<?php
$xml = simplexml_load_file("test.xml");

$result = $xml->xpath("//certain");

print_r($result);
?>

Cevap xpath öneri ve asXML() ile çıktısı bir arada olduğu ortaya çıktı.

Josh Davis tarafından verilen örneği kullanarak:

$people = simplexml_load_string(
      <?xml version="1.0" encoding="utf-8"?>
        <people>
          <certain>
            <name>Jane Doe</name>
            <age>21</age>
          </certain>
          <certain>
            <name>John Smith</name>
            <age>34</age>
          </certain>
        </people>'
    );

    // get all <certain/> nodes
    $nodes = $people->xpath('/people/certain');

    foreach ( $nodes as $node ) {
      $result .= $node->asXML()."\n";
    }
    echo $result;