PHP - XML解析(试图获取非对象的属性)

时间:2014-08-07 06:54:55

标签: php xml

早上好!

我试着描述我的问题:我有一个语言类,在课堂上有一个函数Text(category, item)。 所以我可以调用函数:

Language::Text("indexPage", "hello_world");

输出结果为:

Hello World!

项目的值位于xml文件中。

我的XML文件的结构:

<?xml version="1.0" encoding="UTF-8"?>
<languageBase>
    <language filename="en" language="English">
        <category name="indexPage">
            <item name="hello_world"><![CDATA[Hello World!]]></item>
        </category>
    </language>
</languageBase>

但如果我使用函数Text(..),我会收到错误:

  

尝试获取非对象的属性   第20行的C:\ xampp \ htdocs \ Mvc \ system \ classes \ class.language.php

这是我的班级:

<?php
    if (!defined("OK")) {
        header("Location: ../");
    }

    class Language {
        private static $_language = "de";

        public static function params($string) {
            $string = str_replace("%USERNAME%", User::GetUsername(User::$_id, 1), $string);
            $string = str_replace("%@USERNAME%", User::GetUsername(User::$_id), $string);
            return $string;
        }

        public static function Text($category, $item) {
            $xml = new SimpleXMLElement(file_get_contents(self::GetPath()));
            $category = "indexPage";
            $item = "hello_world";
            $obj = $xml->xpath("/languageBase/language/category[@name=\"{$category}\"]/item[@name=\"{$item}\"]");
            return $obj->entry;
        }

        public static function Set($language) {
            $_SESSION[SESSION_LANGUAGE] = $language;
        }

        public static function Get() {
            if(isset($_SESSION[SESSION_LANGUAGE])) {
                if(file_exists("system/lang/".$_SESSION[SESSION_LANGUAGE].".xml")) {
                    self::$_language = $_SESSION[SESSION_LANGUAGE];
                }
            } else {
                $_SESSION[SESSION_LANGUAGE] = self::$_language;
            }

            return self::$_language;
        }

        public static function GetPath() {
            return "system/lang/".self::Get().".xml";
        }
    }

1 个答案:

答案 0 :(得分:1)

您永远不会定义您想要访问名为&#34; name&#34;的属性。可以有任意数量的其他属性,例如&#34; id&#34;。

你能做的就是像这样使用xpath:

public static function Text($category, $item) {
    $xml = new SimpleXMLElement(file_get_contents(self::GetPath()));
    $items = $xml->xpath("//category[@name='$category']/item[@name='$item']");
    if ($items[0]) {
        return (string)$items[0];
    }
    return null;
}

使用此解决方案,确保$ category和$ item永远不包含xpath控制字符非常重要,即$ item =&#39; my [item]&#39;会产生错误。 在这种情况下,你必须以某种方式逃避$ item和$ category。

xpath并不总是很容易理解。一个很好的资源是:http://www.w3schools.com/xpath/xpath_syntax.asp