【问题标题】:Write a function to parse data from XML file [duplicate]编写一个函数来解析 XML 文件中的数据 [重复]
【发布时间】:2013-07-10 15:40:12
【问题描述】:

我需要编写一个函数来从 XML 文件中获取数据。

这是我第一次尝试做这样的事情。我想像对待 mysql 数据库一样对待它(是的,我是新手)。

XML 的结构如下:

$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<PlayerCount value="2">
    <Position value="Left">
        <Action value="Hit">
            <Range BBIdx="2" model="Math">0.653</Range>
            <Range BBIdx="3" model="Math">0.341</Range>
            <Range BBIdx="4" model="Math">0.216</Range>
        </Action>
        <Action value="Punch">
            <Range BBIdx="0" model="Math">1.000</Range>
            <Range BBIdx="1" model="Math">1.000</Range>
            <Range BBIdx="2" model="Math">0.498</Range>
            <Range BBIdx="3" model="Math">0.256</Range>
            <Range BBIdx="4" model="Math">0.168</Range>
        </Action>
        <Action value="Defend">
            <Range BBIdx="1" model="Math">1.000</Range>
            <Range BBIdx="2" model="Math">1.000</Range>
            <Range BBIdx="3" model="Math">0.503</Range>
            <Range BBIdx="4" model="Math">0.341</Range>
        </Action>
    </Position>
    <Position value="Right">
        <Action value="Hit">
            <Range BBIdx="2" model="Math">0.828</Range>
            <Range BBIdx="3" model="Math">0.416</Range>
            <Range BBIdx="4" model="Math">0.278</Range>
        </Action>
        <Action value="Punch">
            <Range BBIdx="1" model="Math">1.000</Range>
            <Range BBIdx="2" model="Math">0.623</Range>
            <Range BBIdx="3" model="Math">0.309</Range>
            <Range BBIdx="4" model="Math">0.217</Range>
        </Action>
        <Action value="HitDefend">
            <Range BBIdx="2" model="Math">0.628</Range>
            <Range BBIdx="3" model="Math">0.313</Range>
            <Range BBIdx="4" model="Math">0.204</Range>
        </Action>
        <Action value="PunchDefend">
            <Range BBIdx="1" model="Math">0.755</Range>
            <Range BBIdx="2" model="Math">0.380</Range>
            <Range BBIdx="3" model="Math">0.192</Range>
            <Range BBIdx="4" model="Math">0.127</Range>
        </Action>
    </Position>
</PlayerCount>
<PlayerCount value="3">
    <Position value="Up">
        <Action value="Hit">
            <Range BBIdx="2" model="Math">0.455</Range>
            <Range BBIdx="3" model="Math">0.237</Range>
            <Range BBIdx="4" model="Math">0.158</Range>
        </Action>
        <Action value="Punch">
            <Range BBIdx="0" model="Math">0.931</Range>
            <Range BBIdx="1" model="Math">0.702</Range>
            <Range BBIdx="2" model="Math">0.372</Range>
            <Range BBIdx="3" model="Math">0.178</Range>
            <Range BBIdx="4" model="Math">0.117</Range>
        </Action>
        <Action value="Defend">
            <Range BBIdx="1" model="Math">1.000</Range>
            <Range BBIdx="2" model="Math">0.725</Range>
            <Range BBIdx="3" model="Math">0.352</Range>
            <Range BBIdx="4" model="Math">0.235</Range>
        </Action>
    </Position>
    <Position value="Left">
        <Action value="Hit">
            <Range BBIdx="2" model="Math">0.576</Range>
            <Range BBIdx="3" model="Math">0.273</Range>
            <Range BBIdx="4" model="Math">0.189</Range>
        </Action>
        <Action value="Punch">
            <Range BBIdx="0" model="Math">1.000</Range>
            <Range BBIdx="1" model="Math">0.862</Range>
            <Range BBIdx="2" model="Math">0.434</Range>
            <Range BBIdx="3" model="Math">0.209</Range>
            <Range BBIdx="4" model="Math">0.150</Range>
        </Action>
        <Action value="Defend">
            <Range BBIdx="1" model="Math">1.000</Range>
            <Range BBIdx="2" model="Math">0.844</Range>
            <Range BBIdx="3" model="Math">0.439</Range>
            <Range BBIdx="4" model="Math">0.291</Range>
        </Action>
        <Action value="HitDefend">
            <Range BBIdx="2" model="Math">0.429</Range>
            <Range BBIdx="3" model="Math">0.212</Range>
            <Range BBIdx="4" model="Math">0.142</Range>
        </Action>
        <Action value="PunchDefend">
            <Range BBIdx="0" model="Math">0.693</Range>
            <Range BBIdx="1" model="Math">0.530</Range>
            <Range BBIdx="2" model="Math">0.269</Range>
            <Range BBIdx="3" model="Math">0.133</Range>
...
<PlayerCount value="3">
...

我希望能够轻松访问&lt;Range&gt; 标签之间的数字。

类似获取号码的地方

<PlayerCount value="2">
<Position value="Left">
<Action value="Hit">
<Range BBIdx="2" model="Math">

如果是mysql,我会这样做:

$query = "SELECT range FROM modeling WHERE BB='' AND POS='' AND OPP='";

任何帮助都非常感谢。我已经浪费了 2 天的时间来查看 SimpleXML PHP 类,但我不知道如何在这种情况下搜索属性。我相信你不会超过 2 分钟来解决这个问题。

如果我有一个像getnumber('file-xml','playercount','position','action','bbidx');这样的函数就完美了

提前致谢。

这是我写的代码,但我不知道如何使它与属性一起工作:

$xml = new SimpleXMLElement($input);

$res = $xml->xpath('/Playercount[.=2]/Position[.=Left]/Action[.=Hit]/Range[.=2]');

while(list( , $node) = each($result)) {
    echo 'result: ',$node,"\n";
}

很遗憾,这并没有按预期工作。

这是我现在尝试使用的代码:

 <?php


$x = <<<XML
<?xml version='1.0' standalone='yes'?>
<document>
<PlayerCount value="2">
    <Position value="Left">
        <Action value="Hit">
            <Range BBIdx="2" model="Math">0.653</Range>
            <Range BBIdx="3" model="Math">0.341</Range>
            <Range BBIdx="4" model="Math">0.216</Range>
        </Action>
        <Action value="Punch">
            <Range BBIdx="0" model="Math">1.000</Range>
            <Range BBIdx="1" model="Math">1.000</Range>
            <Range BBIdx="2" model="Math">0.498</Range>
            <Range BBIdx="3" model="Math">0.256</Range>
            <Range BBIdx="4" model="Math">0.168</Range>
        </Action>
        <Action value="Defend">
            <Range BBIdx="1" model="Math">1.000</Range>
            <Range BBIdx="2" model="Math">1.000</Range>
            <Range BBIdx="3" model="Math">0.503</Range>
            <Range BBIdx="4" model="Math">0.341</Range>
        </Action>
    </Position>
    <Position value="Right">
        <Action value="Hit">
            <Range BBIdx="2" model="Math">0.828</Range>
            <Range BBIdx="3" model="Math">0.416</Range>
            <Range BBIdx="4" model="Math">0.278</Range>
        </Action>
        <Action value="Punch">
            <Range BBIdx="1" model="Math">1.000</Range>
            <Range BBIdx="2" model="Math">0.623</Range>
            <Range BBIdx="3" model="Math">0.309</Range>
            <Range BBIdx="4" model="Math">0.217</Range>
        </Action>
        <Action value="HitDefend">
            <Range BBIdx="2" model="Math">0.628</Range>
            <Range BBIdx="3" model="Math">0.313</Range>
            <Range BBIdx="4" model="Math">0.204</Range>
        </Action>
        <Action value="PunchDefend">
            <Range BBIdx="1" model="Math">0.755</Range>
            <Range BBIdx="2" model="Math">0.380</Range>
            <Range BBIdx="3" model="Math">0.192</Range>
            <Range BBIdx="4" model="Math">0.127</Range>
        </Action>
    </Position>
</PlayerCount>
</document>
XML;

$xml = simplexml_load_string($x);

//$result = (string)$xml->xpath("//PlayerCount[@value='2']/Position[@value='Left']/Action[@value='Hit']/Range[@BBIdx='2' and @model='Math']")[0];

list($result) = (string)$xml->xpath("//document/PlayerCount[@value='2']/Position[@value='Left']/Action[@value='Hit']/Range[@BBIdx='2' and @model='Math']");
var_dump($result);

?>

Var_dump 返回 NULL。怎么会?

【问题讨论】:

  • 您忘记将您编写的 PHP 代码添加到问题中。
  • XPath 是你的朋友。
  • 我对你的评论投了赞成票。我正在添加它,安德鲁西。
  • 我已经添加了我自带的代码。我不知道如何使它与属性一起使用...

标签: php xml parsing xpath simplexml


【解决方案1】:

你的 xpath 就差不多了,尽管使用 @for 属性:

$result = (string)$xml->xpath("//PlayerCount[@value='2']/Position[@value='Left']/Action[@value='Hit']/Range[@BBIdx='2' and @model='Math']")[0];

这将适用于 PHP >= 5.4 并返回 first 选定值。
看到它工作:http://codepad.viper-7.com/fI1Dh6

使用 PHP

list($result) = $xml->xpath(...);
$result = (string)$result;  

或者做...

$result = $xml->xpath("//PlayerCount[@value='2']/Position[@value='Left']/Action[@value='Hit']/Range[@BBIdx='2' and @model='Math']");
$result = (string)$result[0];

看到它的工作:http://codepad.viper-7.com/2DhUiN

【讨论】:

  • 感谢您的回答!但是我有 PHP 5.3.5。我该如何解决这个问题?
  • @Giorgio:更新 PHP?如果这不可能,请参阅我的编辑...
  • 对不起michi,我试过你的PHP
  • @Giorgio:查看我的最新编辑和代码示例。这会起作用的。
  • 太棒了!!奇迹般有效! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多