dongwan5381 2015-07-17 15:58 采纳率: 100%
浏览 41
已采纳

PHP使用simplexml_load_string加载XML文档

I am new to work with XML files. I've been trying to load the an XML document with the following format as object or array: After the this edit

<?xml version="1.0"?>
<xdm:Device xmlns:xdm="http://www.example.com/schemas/imaging/con/xdm/1.1/" 
           xmlns:dd="http://www.example.com/schemas/imaging/con/dictionaries/1.0/" 
           xmlns:bsi="http://www.example.com/schemas/imaging/con/bsi/2003/08/21" 
           xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
           xmlns:count="http://www.example.com/schemas/imaging/con/counter/2006/01/13" 
           xmlns:media="http://www.example.com/schemas/imaging/con/media/2006/01/13/" 
           xmlns:xsi="http://www.example.org/2001/XMLSchema-instance" 
           xmlns:tt="http://www.example.com/schemas/imaging/con/capabilities/1.1/" 
           xmlns:pwg="http://www.example.com/schemas/imaging/con/pwg/sm/1.0/">
    <xdm:Information>        
        <xdm:Component id="system" componentType="system">
            <dd:MakeAndModel>Samsung LaserJet ML220</dd:MakeAndModel>
            <dd:Description>Blackand while printer</dd:Description>
            <dd:ProductNumber>XB3zzz</dd:ProductNumber>
            <dd:Manufacturer>
                <dd:Name>Samsung</dd:Name>
            </dd:Manufacturer>
        </xdm:Component>
    </xdm:Information>    
</xdm:Device>

I would like to get from every entrance for instance the MakeAndModel, Description, Manufacturer, etc.

I am trying to load the code with the following code currently, but I've tried a lot of things:

$xmlString = file_get_contents('test.xml');
$xml = simplexml_load_string($xmlString); 
var_dump($xml);

I have tried with other simpler XML documents and it works fine. But with my document it does not work, it loads an empty object instead. The file does not have a title. I read in php.net the following in one of the examples:

// The file test.xml contains an XML document with a root element // and at least an element /[root]/title.

How can I achieve load this XML to array or Object?

Edit2:

When I use a simple XML file from example var_dump outputs the following:

[root@windows8 csvmail]# php ppp.php 
object(SimpleXMLElement)#1 (1) {
  ["movie"]=>
  object(SimpleXMLElement)#2 (5) {
    ["title"]=>
    string(22) "PHP: Behind the Parser"

Whit the real file if get the following:

[root@windows8 csvmail]# php ppp.php 
object(SimpleXMLElement)#1 (0) {
}
[root@windows8 csvmail]# 
  • 写回答

1条回答 默认 最新

  • duankui6150 2015-07-17 18:10
    关注

    The nodes with : in them are in "XML namespaces". They are used to mix multiple types of data into one file, even if the tag names would otherwise collide.

    At the top of the file, the xmlns:... attributes associate prefixes (which could be changed by whatever is generating the file) with URLs (which act as a permanent identifier for a particular type of data).

    To access them with SimpleXML, you use the ->children() method to "select" the namespace. You can rely on the prefix not changing, or you can store the permanent identifiers in a variable or constant, and use that, like this:

    // Defining my own ways of referring to the namespaces, regardless of prefix used
    define('XMLNS_HP_XDM_1_1', 'http://www.hp.com/schemas/imaging/con/xdm/1.1/');
    define('XMLNS_HP_DICT_1_0', 'http://www.hp.com/schemas/imaging/con/dictionaries/1.0/');
    
    // Load the XML in the normal way
    $sx = simplexml_load_string($xml);
    
    // Switch to the first namespace, and look at the first Component
    $component = $sx->children(XMLNS_HP_XDM_1_1)->Information->Component;
    
    // Attributes with no : in are technically in no namespace at all,
    // so we have to switch back to the null namespace using attributes()
    $component_id = (string)$component->attributes(null)->id;
    
    // Switch to the second namespace to find the MakeAndModel
    $make_and_model = (string)$component->children(XMLNS_HP_DICT_1_0)->MakeAndModel;
    
    echo "$component_id : $make_and_model";
    

    [Live Demo]

    For how to loop over multiple elements, and other basic usage, see the examples in the PHP manual.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化