这可能是重复的,但到目前为止我没有发现任何有用的东西。
我目前面临的问题是我试图通过 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>
答案 0 :(得分:0)
您在这里走在正确的轨道上,但我认为您需要让 XPath 为您做更多的工作。目前尚不完全清楚您要实现的目标。您需要以不同的方式查询您想要的不同信息。如果您希望能够通过字段或菜单项 ID 提取标题或占位符,则需要制作不同的查询来执行此操作。有关如何执行此操作的示例,请参阅 getPlaceholderForInputByIdAndLanguage
和 getPlaceholderForInputByIdAndLanguage
。如果您想同时提取所有占位符和标题并将它们与它们所属的字段/菜单项相关联,您同样需要使用两个查询来执行此操作,我们可以在函数中执行此操作并合并结果- 见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;
}