通过xml文件中的属性id获取每个元素的值

时间:2021-04-28 18:24:07

标签: php html xml

这可能是重复的,但到目前为止我没有发现任何有用的东西。

我目前面临的问题是我试图通过 lang id 获取每个控件(占位符、工具提示、标题)和每个项目(标题)的 lang 值。

我尝试过更改 xpath,但无济于事。

如何通过 lang id 获取每个项目的标题值?

我试试..

$pageMenu = new simplexmlelement($xml);

foreach($pageMenu->menucontrol->contrlos->control as $control){

    $placeholder = $pageMenu->menucontrol->contrlos->xpath(
        "//control[@category='{$category}']//placeholder//lang[@id='{$lang}']"
    );     
}

xml..

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
  <menucontrol name="pageMenu">
    <contrlos>

      <control category="input">
        <type>number</type>
        <permission role="0">1</permission>
        <permission role="1">1</permission>
        <permission role="2">1</permission>

        <caption>
          <lang id="en"/>
          <lang id="ru"/>
          <lang id="ua"/>
        </caption>

        <placeholder>
          <lang id="en">Ticket 22#</lang>
          <lang id="ru">Ticket #</lang>
          <lang id="ua">Ticket #</lang>
        </placeholder>

        <tooltip>
          <lang id="en"/>
          <lang id="ru"/>
          <lang id="ua"/>
        </tooltip>

        <onpageevent/>
        <serverevent>searchTicketByNumber</serverevent>

        <showon>
          <tickets>1</tickets>
          <companies>0</companies>
          <consumer-users>0</consumer-users>
          <products>0</products>
          <staff>0</staff>
        </showon>

        <icon/>
        <disabled>0</disabled>

        <attributes>
          <attribute name="class">input-field</attribute>
          <attribute name="id">inputTiketId</attribute>
          <attribute name="min">0</attribute>
        </attributes>

      </control>

      <control class="dropdown" category="dropList">
        <type>button</type>
        <permission role="0">1</permission>
        <permission role="1">1</permission>
        <permission role="2">1</permission>
        <caption>
          <lang id="en">New</lang>
          <lang id="ru">New</lang>
          <lang id="ua">New</lang>
        </caption>
        <tooltip>
          <lang id="en"/>
          <lang id="ru"/>
          <lang id="ua"/>
        </tooltip>
        <icons>
          <icon class="svg" alt="image">new.svg</icon>
          <icon class="svg" alt="image">arrow-b.svg</icon>
        </icons>
        <disabled>0</disabled>
        <onpageevent>ShowListItems</onpageevent>
        <serverevent/>
        <showon>
          <tickets>1</tickets>
          <companies>0</companies>
          <consumer-users>0</consumer-users>
          <products>0</products>
          <staff>0</staff>
        </showon>

        <attributes>
          <attribute name="class">btn</attribute>
          <attribute name="class">btn-secondary</attribute>
          <attribute name="data-toggle">dropdown</attribute>
        </attributes>

        <listitems>

          <item category="ListItem">

            <permission role="0">100</permission>
            <permission role="1">1</permission>
            <permission role="2">0</permission>

            <caption>
              <lang id="en">New ticket</lang>
              <lang id="ru">New ticket</lang>
              <lang id="ua">New ticket</lang>
            </caption>

            <attributes>
              <attribute name="class">dropdown-item__sub</attribute>
              <attribute name="for">newTicket</attribute>
            </attributes>

            <icon/>
            <onpageevent>newTicket</onpageevent>
            <serverevent/>
          </item>

          <item category="ListItem">

            <permission role="0">1</permission>
            <permission role="1">1</permission>
            <permission role="2">0</permission>
            <caption>
              <lang id="en">New product</lang>
              <lang id="ru">New product</lang>
              <lang id="ua">New product</lang>
            </caption>
            <attributes>
              <attribute name="class">dropdown-item__sub</attribute>
              <attribute name="for">asideNewProduct</attribute>
            </attributes>
            <icon/>
            <onpageevent>asideNewProduct</onpageevent>
            <serverevent/>

          </item>

          <item category="ListItem">
            <permission role="0">1</permission>
            <permission role="1">1</permission>
            <permission role="2">0</permission>
            <caption>
              <lang id="en">New staff</lang>
              <lang id="ru">New staff</lang>
              <lang id="ua">New staff</lang>
            </caption>
            <attributes>
              <attribute name="class">dropdown-item__sub</attribute>
              <attribute name="for">asideNewUser</attribute>
            </attributes>
            <icon/>
            <onpageevent>asideNewUser</onpageevent>
            <serverevent/>
          </item>

          <item category="ListItem">
            <permission role="0">1</permission>
            <permission role="1">1</permission>
            <permission role="2">0</permission>
            <caption>
              <lang id="en">New consumer user</lang>
              <lang id="ru">New consumer user</lang>
              <lang id="ua">New consumer user</lang>
            </caption>
            <attributes>
              <attribute name="class">dropdown-item__sub</attribute>
              <attribute name="for">asideNewConsumerUser</attribute>
            </attributes>
            <icon/>
            <onpageevent>asideNewConsumerUser</onpageevent>
            <serverevent/>
          </item>

          <item category="ListItem">
            <permission role="0">1</permission>
            <permission role="1">1</permission>
            <permission role="2">0</permission>
            <caption>
              <lang id="en">New company</lang>
              <lang id="ru">New company</lang>
              <lang id="ua">New companyr</lang>
            </caption>
            <attributes>
              <attribute name="class">dropdown-item__sub</attribute>
              <attribute name="for">asideNewCompany</attribute>
            </attributes>
            <icon/>
            <onpageevent>asideNewCompany</onpageevent>
            <serverevent/>
          </item>

        </listitems>
      </control>
    </contrlos>
  </menucontrol>
</Configuration>

1 个答案:

答案 0 :(得分:0)

您在这里走在正确的轨道上,但我认为您需要让 XPath 为您做更多的工作。目前尚不完全清楚您要实现的目标。您需要以不同的方式查询您想要的不同信息。如果您希望能够通过字段或菜单项 ID 提取标题或占位符,则需要制作不同的查询来执行此操作。有关如何执行此操作的示例,请参阅 getPlaceholderForInputByIdAndLanguagegetPlaceholderForInputByIdAndLanguage。如果您想同时提取所有占位符和标题并将它们与它们所属的字段/菜单项相关联,您同样需要使用两个查询来执行此操作,我们可以在函数中执行此操作并合并结果- 见getFieldIdToLabelMapForLanguage。提示很奇怪,因为下拉菜单有一个工具提示,但整个下拉菜单似乎没有任何标识符,所以我不确定您将如何查询特定的工具提示,或将其与其父项相关联。您可以看到如何在 getTooltipsForLanguage 中简单地提取所有这些。

<?php

function getPlaceholderForInputByIdAndLanguage($rootElement, $fieldId, $language)
{
    $placeholder = $rootElement->xpath("//control[attributes/attribute[@name='id'][text() = '$fieldId']]//placeholder//lang[@id='{$language}']");
    return $placeholder[0];
}

function getCaptionForListItemByFiendNameAndLanguage($rootElement, $fieldName, $language)
{
    $caption = $rootElement->xpath("//control[@category='dropList']//item[attributes/attribute[@name='for'][text() = '$fieldName']]//caption//lang[@id='{$language}']");
    return $caption[0];
}

function getFieldIdToLabelMapForLanguage($rootElement, $language)
{
    $buffer = [];
    $items = $rootElement->xpath("//control[@category='input']");
    foreach($items as $currItem)
    {
        $id = $currItem->xpath("attributes/attribute[@name='id']");
        $placeholder = $currItem->xpath("placeholder//lang[@id='{$language}']");

        $buffer[(string) $id[0]] = (string) $placeholder[0];
    }

    $items = $rootElement->xpath("//control[@class='dropdown']//item");
    foreach($items as $currItem)
    {
        $for = $currItem->xpath("attributes/attribute[@name='for']");
        $caption = $currItem->xpath("caption//lang[@id='{$language}']");

        $buffer[(string) $for[0]] = (string) $caption[0];
    }

    return $buffer;
}

function getTooltipsForLanguage($rootElement, $language)
{
    $buffer = [];
    $tooltips = $rootElement->xpath("//tooltip//lang[@id='{$language}']");
    foreach($tooltips as $currTooltip)
    {
        $buffer[] = (string) $currTooltip[0];
    }

    return $buffer;
}

$pageMenu = simplexml_load_string($xml);

$placeholder = getPlaceholderForInputByIdAndLanguage($pageMenu, 'inputTiketId', 'en');
echo 'Placeholder for inputTiketId: '.$placeholder.PHP_EOL;

$caption = getCaptionForListItemByFiendNameAndLanguage($pageMenu, 'asideNewProduct', 'en');
echo 'Caption for asideNewProduct: '.$caption.PHP_EOL;

$idToLabelMap = getFieldIdToLabelMapForLanguage($pageMenu, 'en');

echo PHP_EOL.'All id to label mappings:'.PHP_EOL;
foreach ($idToLabelMap as $attributeName=>$caption)
{
    echo $attributeName.':'.$caption.PHP_EOL;
}

$tooltips = getTooltipsForLanguage($pageMenu, 'en');

echo PHP_EOL.'All tooltips:'.PHP_EOL;
foreach ($tooltips as $tooltip)
{
    echo $tooltip.PHP_EOL;
}