使用simpleXml或Xpath按标记名称删除元素并将其另存为xml文件?

时间:2016-02-12 16:36:49

标签: php xml simplexml

我正在尝试从此xml文件中按标记名称获取元素。

<cogxml>
    <namespace name="http://www.lirmm.fr/cogui#" prefix=""/>
    <support name="vocabulary">
       <conceptTypes>
           <ctype id="http://www.lirmm.fr/cogui#ct_043ea910-5f86-4150-b0f1-1418acf4db39" label="Junior Employee" x="250" y="10">
               <translation descr="" label="Junior Employee" lang="en"/>
           </ctype>
           <ctype id="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00" label="Employee" x="130" y="60">
               <translation descr="" label="Employee" lang="en"/>
           </ctype>
           <ctype id="http://www.lirmm.fr/cogui#ct_feeca670-2f1c-433e-9271-4cffeda1e929" label="Director" x="250" y="110">
               <translation descr="" label="Director" lang="en"/>
           </ctype>
           <ctype id="http://www.lirmm.fr/cogui#ct_710bed80-a33e-4a13-b916-15fbb3357e8d" label="Manager" x="250" y="60">
               <translation descr="" label="Manager" lang="en"/>
           </ctype>
           <ctype id="http://www.lirmm.fr/cogui#ct_cd84c648-ef22-4854-8e8c-a6654c0386be" label="Senior Employee" x="255" y="190">
               <translation descr="" label="Senior Employee" lang="en"/>
           </ctype>
           <ctype id="http://www.lirmm.fr/cogui#_ct_a12bacc5-bc88-429e-a7b1-45e143591288" label="Top" x="10" y="60">
               <translation descr="" label="Top" lang="en"/>
           </ctype>
           <order id1="http://www.lirmm.fr/cogui#ct_cd84c648-ef22-4854-8e8c-a6654c0386be" id2="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00"/>
           <order id1="http://www.lirmm.fr/cogui#ct_feeca670-2f1c-433e-9271-4cffeda1e929" id2="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00"/>
           <order id1="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00" id2="http://www.lirmm.fr/cogui#_ct_a12bacc5-bc88-429e-a7b1-45e143591288"/>
           <order id1="http://www.lirmm.fr/cogui#ct_043ea910-5f86-4150-b0f1-1418acf4db39" id2="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00"/>
           <order id1="http://www.lirmm.fr/cogui#ct_710bed80-a33e-4a13-b916-15fbb3357e8d" id2="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00"/>
       </conceptTypes>
       <relationTypes>
           <rtype id="http://www.lirmm.fr/cogui#_rt_c42a5ce6-2f20-491d-8c91-501ae178a36c" idSignature="http://www.lirmm.fr/cogui#_ct_a12bacc5-bc88-429e-a7b1-45e143591288 http://www.lirmm.fr/cogui#_ct_a12bacc5-bc88-429e-a7b1-45e143591288" label="Link" x="10.0" y="10.0">
              <translation descr="" label="Link" lang="en"/>
           </rtype>
           <rtype id="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" idSignature="http://www.lirmm.fr/cogui#_ct_a12bacc5-bc88-429e-a7b1-45e143591288 http://www.lirmm.fr/cogui#_ct_a12bacc5-bc88-429e-a7b1-45e143591288" label="senior" x="70.0" y="10.0">
              <translation descr="" label="senior" lang="en"/>
           </rtype>
           <order id1="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" id2="http://www.lirmm.fr/cogui#_rt_c42a5ce6-2f20-491d-8c91-501ae178a36c"/>
      </relationTypes>
      <nestingTypes>
          <ntype id="http://www.lirmm.fr/cogui#_nt_4d626655-02b5-496e-b19c-f4cdb72ee70a" label="Nesting">
              <translation descr="" label="Nesting" lang="en"/>
          </ntype>
      </nestingTypes>
      <conformity>
          <marker id="http://www.lirmm.fr/cogui#i_435d513c-1b39-43b1-9b6d-310fa0ee46d3" idType="http://www.lirmm.fr/cogui#ct_710bed80-a33e-4a13-b916-15fbb3357e8d" label="Lucy"/>
          <marker id="http://www.lirmm.fr/cogui#i_80311575-7d72-4af7-bdbe-a19c4bbcf248" idType="http://www.lirmm.fr/cogui#ct_cd84c648-ef22-4854-8e8c-a6654c0386be" label="Simon"/>
          <marker id="http://www.lirmm.fr/cogui#i_d1a8babc-3d35-4580-b4d5-d3cd4c323c98" idType="http://www.lirmm.fr/cogui#ct_043ea910-5f86-4150-b0f1-1418acf4db39" label="Robyn"/>
          <marker id="http://www.lirmm.fr/cogui#i_efbef15b-d6e2-4c0a-8155-ecaae75cc673" idType="http://www.lirmm.fr/cogui#ct_feeca670-2f1c-433e-9271-4cffeda1e929" label="Richard"/>
      </conformity>
      <modules/>
   </support>
   <localeTypes name="undefined_vocabulary">
      <conceptTypes/>
      <relationTypes/>
      <nestingTypes/>
      <conformity/>
      <modules/>
   </localeTypes>
   <graph id="_g1" label="seniorities" nature="fact" set="default_set">
      <concept id="c_f55e1936-7842-4518-b460-bb34a9000871" idMarker="http://www.lirmm.fr/cogui#i_d1a8babc-3d35-4580-b4d5-d3cd4c323c98" idType="http://www.lirmm.fr/cogui#ct_043ea910-5f86-4150-b0f1-1418acf4db39" referent="individual" x="0" y="0"/>
      <concept id="c_f081c276-57ff-4650-94ec-6e40dfd38023" idMarker="http://www.lirmm.fr/cogui#i_80311575-7d72-4af7-bdbe-a19c4bbcf248" idType="http://www.lirmm.fr/cogui#ct_cd84c648-ef22-4854-8e8c-a6654c0386be" referent="individual" x="185" y="70"/>
      <concept id="c_f0229ed1-c913-4373-af9c-361a90a56e90" idMarker="http://www.lirmm.fr/cogui#i_435d513c-1b39-43b1-9b6d-310fa0ee46d3" idType="http://www.lirmm.fr/cogui#ct_710bed80-a33e-4a13-b916-15fbb3357e8d" referent="individual" x="330" y="170"/>
      <concept id="c_dbe5b7cb-7d00-44f1-8b9a-832d5b61a126" idMarker="http://www.lirmm.fr/cogui#i_efbef15b-d6e2-4c0a-8155-ecaae75cc673" idType="http://www.lirmm.fr/cogui#ct_feeca670-2f1c-433e-9271-4cffeda1e929" referent="individual" x="445" y="260"/>
      <relation id="r_10008dd3-5426-4c87-8651-049045f98376" idType="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" x="90" y="70"/>
      <relation id="r_8ef0b4bf-3cb6-4dde-9c83-903cb459872a" idType="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" x="235" y="135"/>
      <relation id="r_563d1804-04eb-45d4-81c9-f4bd4782e0b1" idType="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" x="355" y="260"/>
      <edge cid="c_f55e1936-7842-4518-b460-bb34a9000871" label="1" rid="r_10008dd3-5426-4c87-8651-049045f98376"/>
      <edge cid="c_f081c276-57ff-4650-94ec-6e40dfd38023" label="2" rid="r_10008dd3-5426-4c87-8651-049045f98376"/>
      <edge cid="c_f081c276-57ff-4650-94ec-6e40dfd38023" label="1" rid="r_8ef0b4bf-3cb6-4dde-9c83-903cb459872a"/>
      <edge cid="c_f0229ed1-c913-4373-af9c-361a90a56e90" label="2" rid="r_8ef0b4bf-3cb6-4dde-9c83-903cb459872a"/>
      <edge cid="c_f0229ed1-c913-4373-af9c-361a90a56e90" label="1" rid="r_563d1804-04eb-45d4-81c9-f4bd4782e0b1"/>
      <edge cid="c_dbe5b7cb-7d00-44f1-8b9a-832d5b61a126" label="2" rid="r_563d1804-04eb-45d4-81c9-f4bd4782e0b1"/>
   </graph>
   <graph id="_query1" label="Richard senior to Robyn" nature="query" set="default_set">
      <concept id="c_90dc1159-1d02-4707-a444-2e95817d8667" idMarker="http://www.lirmm.fr/cogui#i_d1a8babc-3d35-4580-b4d5-d3cd4c323c98" idType="http://www.lirmm.fr/cogui#ct_043ea910-5f86-4150-b0f1-1418acf4db39" referent="individual" x="30" y="165"/>
      <concept id="c_4af4cf1c-5383-413b-bee2-7a4c513fd37e" idMarker="http://www.lirmm.fr/cogui#i_efbef15b-d6e2-4c0a-8155-ecaae75cc673" idType="http://www.lirmm.fr/cogui#ct_feeca670-2f1c-433e-9271-4cffeda1e929" referent="individual" x="45" y="25"/>
      <relation id="r_c51c5a9c-3cf5-4402-a356-03c9882f6b78" idType="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" x="75" y="95"/>
     <edge cid="c_90dc1159-1d02-4707-a444-2e95817d8667" label="1" rid="r_c51c5a9c-3cf5-4402-a356-03c9882f6b78"/>
     <edge cid="c_4af4cf1c-5383-413b-bee2-7a4c513fd37e" label="2" rid="r_c51c5a9c-3cf5-4402-a356-03c9882f6b78"/>
   </graph>
   <rule id="_rule1">
      <hypt>
         <graph id="_rule1_hypt" label="seniority rule" nature="rule" set="default_set">
         <concept id="c_591883b6-ca82-42ee-bd35-b4ce29ffd286" idType="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00" x="30" y="45"/>
         <concept id="c_f765dff9-1cd4-42f1-bf95-87cbda00257d" idType="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00" x="30" y="173"/>
         <concept id="c_669f89c9-eb93-4caa-aa90-f8e31be92245" idType="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00" x="30" y="293"/>
         <relation id="r_93ecba23-873d-490c-8ce3-40611158006b" idType="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" x="45" y="113"/>
         <relation id="r_257f3815-2ac4-4b9e-8b8c-7d9ae6259b52" idType="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" x="53" y="233"/>
         <edge cid="c_591883b6-ca82-42ee-bd35-b4ce29ffd286" label="1" rid="r_93ecba23-873d-490c-8ce3-40611158006b"/>
         <edge cid="c_f765dff9-1cd4-42f1-bf95-87cbda00257d" label="2" rid="r_93ecba23-873d-490c-8ce3-40611158006b"/>
         <edge cid="c_f765dff9-1cd4-42f1-bf95-87cbda00257d" label="1" rid="r_257f3815-2ac4-4b9e-8b8c-7d9ae6259b52"/>
         <edge cid="c_669f89c9-eb93-4caa-aa90-f8e31be92245" label="2" rid="r_257f3815-2ac4-4b9e-8b8c-7d9ae6259b52"/>
      </graph>
    </hypt>
    <conc>
       <graph id="_rule1_conc">
           <concept id="c_fe469224-c26a-49dc-a17a-697faa20aca3" idType="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00" x="173" y="53"/>
           <concept id="c_656473af-5b41-4ed7-b4fc-be3af9ce544d" idType="http://www.lirmm.fr/cogui#ct_d7a78641-722f-4609-8f5a-90affc111e00" x="180" y="293"/>
           <relation id="r_3b36e657-bc62-4050-baad-c3a04ade3af2" idType="http://www.lirmm.fr/cogui#rt_af40394c-9e62-4e92-b05b-352de5db876f" x="203" y="158"/>
           <edge cid="c_fe469224-c26a-49dc-a17a-697faa20aca3" label="1" rid="r_3b36e657-bc62-4050-baad-c3a04ade3af2"/>
           <edge cid="c_656473af-5b41-4ed7-b4fc-be3af9ce544d" label="2" rid="r_3b36e657-bc62-4050-baad-c3a04ade3af2"/>
        </graph>
      </conc>
      <conPts>
         <couple idC1="c_591883b6-ca82-42ee-bd35-b4ce29ffd286" idC2="c_fe469224-c26a-49dc-a17a-697faa20aca3"/>
         <couple idC1="c_669f89c9-eb93-4caa-aa90-f8e31be92245" idC2="c_656473af-5b41-4ed7-b4fc-be3af9ce544d"/>
      </conPts>
   </rule>
</cogxml>

我需要为每个ctype输出这样的内容。 order id1rtype ID必须与ctype ID匹配。

   <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <cogxml>
        <support name="vocabulary">
           <conceptTypes>
               <ctype id="http://www.lirmm.fr/cogui#ct_ef8dc30a-fc37-48fa-80f3-4588e4d101d2" label="Adult" x="70" y="60">
                  <translation descr="" label="Adult" lang="en"/>
               </ctype>
               <order id1="http://www.lirmm.fr/cogui#ct_ef8dc30a-fc37-48fa-80f3-4588e4d101d2" id2="http://www.lirmm.fr/cogui#_ct_5f3287f9-fb7b-47c2-84b0-e25694b29841"/>
           </conceptTypes>
           <relationTypes>
                <rtype id="http://www.lirmm.fr/cogui#rt_05fd573c-12e2-468e-aee9-746ef400e8d1" idSignature="http://www.lirmm.fr/cogui#ct_ef8dc30a-fc37-48fa-80f3-4588e4d101d2 http://www.lirmm.fr/cogui#_ct_5f3287f9-fb7b-47c2-84b0-e25694b29841" label="Parent Of Child">
                   <translation descr="" label="Parent Of Child" lang="en"/>
                </rtype>
           </relationTypes>
       </support>
    </cogxml>

我如何动态匹配ctype idrtype idorder id?我尝试使用第二个答案中的链接来完成它,但我不知道你会怎么做,我怎么把这一小部分代码放在表中的新行?目前我已经获得了这个PHP代码,但我不知道如何在底部执行if语句,以便在表格中,根据conceptTypes,每行中会出现类似上面代码的部分。

<?php 

$dom = new DOMDocument('1.0', 'utf-8');
                                $dom->formatOutput = true;
$dom->preserveWhiteSpace = false;

$dom->load($name);

$xpath = new DOMXPath($dom);

foreach ($xpath->query("/cogxml/graph")
 as $node) {

    $node->parentNode->removeChild($node); 

 }
 foreach ($xpath->query("/cogxml/rule")
 as $node1) {

    $node1->parentNode->removeChild($node1); 

 }

 foreach ($xpath->query("/cogxml/namespace")
 as $node2) {

    $node2->parentNode->removeChild($node2); 

 }

 foreach ($xpath->query("/cogxml/support/nestingTypes")
 as $node3) {

    $node3->parentNode->removeChild($node3); 

 }

 foreach ($xpath->query("/cogxml/support/modules")
 as $node4) {

    $node4->parentNode->removeChild($node4); 

 }

  foreach ($xpath->query("/cogxml/support/conformity")
 as $node5) {

    $node5->parentNode->removeChild($node5); 

 }

 foreach ($xpath->query("/cogxml/localeTypes")
 as $node6) {

    $node6->parentNode->removeChild($node6); 

 }

 foreach ($xpath->query("/cogxml/support/relationTypes/order")
 as $node7) {

    $node7->parentNode->removeChild($node7); 

 }

 foreach ($xpath->query("/cogxml/support/bannedTypes")
 as $node8) {

    $node8->parentNode->removeChild($node8); 

 }

 //$ctypeid=$dom->suppprt->conceptTypes->ctype['id'];
 foreach ($xpath->query("/cogxml/support/conceptTypes/ctype") as $node9){
 if ($xpath->query("/cogxml/support/conceptTypes/ctype['id']") != $xpath->query("/cogxml/support/relationTypes/rtype['idsignature']") && $xpath->query("/cogxml/support/conceptTypes/order['id1']")) {
  #if($ctype[0] == $xpath->query(){
    $node9->parentNode->removeChild($node9);      
  }

}

#if($dom->cogxml->support->conceptTypes->ctype['id'] )

 #$xml->formatOutput = true;
 $dom->save('test.xml');
 ?>
 <pre><code class="language-xml"><?php echo htmlspecialchars(file_get_contents('test.xml'), ENT_QUOTES); ?></code></pre>

2 个答案:

答案 0 :(得分:1)

localeTypesgraph元素与support元素的内容分开 它们与support元素位于同一级别(不在$xml->support->localeTypes内)。
要删除目标元素,请更改代码,如下所示:

...
foreach ($xml->localeTypes as $code6){
    $elementsToRemove[] = $code6;
}
foreach ($xml->graph as $code){
    $elementsToRemove[] = $code;
}
...

答案 1 :(得分:0)

As a general strategy, you seem to delete all non-matching nodes from the XML.

As a next step, you should iterate over <ctype> and get its id attribute:

foreach ($xml->support-conceptTypes->ctype as $ctype) {
    $ctypeid = (string)$ctype['id'];
}

Then, you can iterate over all <order> and then all <rtype> nodes and delete those that do not match $ctypeid.

Alternative #1 is to use xpath instead of iterating and comparing.

Alternative #2 is - instead of deleting nodes you do not need - to select nodes you do need and build a new XML from there.

I suggest you write some code, test it, and update your question if a new problem arises.

Again, for testing purposes, I strongly suggest to build a simpler XML by replacing the complex links in the id attribute by a simple number or word.