我需要帮助php解析xml以插入mysql数据库

时间:2011-04-09 07:07:53

标签: php mysql xml parsing

大家阿罗哈,

我提前为许多问题道歉,但我被要求开发一个数据库,没有PHP和MySQL的经验。我认为尝试对它们进行一些学习并尝试为我的工作同时开发一个概念数据库对我来说是一个很好的练习。基本上这是一个使用SYDI从我们基于Windows的计算机获取WMI信息以用于补丁管理的数据库。我设想这种工作的方式是这样的:

  1. 运行SYDI并生成包含信息的XML文件。
  2. 使用PHP前端到我们的补丁数据库,解析XML报告,然后将所需信息插入MySQL数据库。
  3. 从数据库生成报告,以与活动的最新已知基准进行比较。如果发现计算机低于基线,则使用修补程序服务器将所需的修补程序提供给逾期计算机。
  4. SYDI的XML报告中使用了几种格式,一种在单个标记中使用属性,另一种格式包含多个带有属性的子标记。我已经想出如何解析第一个。这是一个数据样本及其代码(这是非常基本的东西)和产生的输出:

    <machineinfo manufacturer="Dell Inc." productname="Precision M90" identifyingnumber="87ZGFD1" chassis="Portable" /> 
    
    $xml = simplexml_load_file("sydiTest.xml");
    
    foreach($xml->machineinfo[0]->attributes() as $a => $b)
        {
            echo $b, "</br>";
        }
    
    Dell Inc.
    Precision M90
    87ZGFD1
    Portable
    

    我不需要属性的名称,只需要值,所以我只回显了$ b那里。对于第二个,这里是数据本身的示例以及解析的代码和输出:

     <patches>
      <patch description="Microsoft .NET Framework 1.1 Security Update (KB2416447)" hotfixid="M2416447" installdate="04-Feb-11" />
      <patch description="Microsoft .NET Framework 1.1 Service Pack 1 (KB867460)" hotfixid="S867460" installdate="04-Feb-11" />
      <patch description="Windows Management Framework Core" hotfixid="KB968930" installdate="2/4/2011" />
      <patch description="Security update for MSXML4 SP2 (KB954430)" hotfixid="Q954430" installdate="04-Feb-11" />
      <patch description="Security update for MSXML4 SP2 (KB973688)" hotfixid="Q973688" installdate="04-Feb-11" />
      <patch description="Microsoft Internationalized Domain Names Mitigation APIs" hotfixid="IDNMitigationAPIs" installdate="6/30/2008" />
     </patches>
    
    foreach ($xml->patches->patch[0]->attributes() as $a => $b) 
        {
            echo $b, "</br>";
        }
    
    Microsoft .NET Framework 1.1 Security Update (KB2416447)
    M2416447
    04-Feb-11
    

    正如你所看到的,我只得到了第一个补丁,而不是其他补丁。我认为'patch [0]'很可能是问题,因为它只引用第一个子标记。我怎样才能引用其他孩子?

    结果引发了另一个问题。有没有办法挑选出具体的属性并忽略其余的属性?例如,在第一个解析中,machineinfo解析获取了我需要的所有信息。在第二个解析中,我只需要描述和hotfixid。一旦我得到了解析的正确语法,假设它像第一个一样运行,我很可能得到所有的属性。我不需要安装日期。

    最后,如何将检索到的值分配给变量?第一个解析导致我需要的数据,但不是正确的顺序。我的表结构是这样的:

    CREATE TABLE InventoryItems
        (InvSerNum          VARCHAR(20) NOT NULL,
        Make                VARCHAR(20),
        Model               VARCHAR(20),
        Platform            VARCHAR(12),
    CONSTRAINT Inventory_PK PRIMARY KEY (InvSerNum));
    

    我首先需要识别号码(InvSerNum)。当然,我总是可以重新排序表中的字段以匹配XML,但我宁愿保持原样。我的想法是我可以使用INSERT语句并只使用变量来输入值。

    我正在尝试自己完成所有这些工作,但却陷入了XML解析部分。如果有人可以帮助我理解这个过程,我会欠你的债。

2 个答案:

答案 0 :(得分:0)

尝试在PHP中使用RapidXML。使XML解析更容易。它仍然不那么直观:你需要一个好的调试器才能找到它的底部。 其余的问题要求您对PHP中的mysql_(function_name)绑定进行一些研究。那里有很多关于此的文章。

答案 1 :(得分:0)

我想出了第二个解析问题。我使用了以下代码:

foreach ($xml->patches->patch as $patch1) {
    foreach ($patch1->attributes() as $a => $b) {
        echo $b, "<br />";
    }
}

它就像一个魅力!我仍然需要省略最后一个属性,将它们分配给变量,使用INSERT语句将它们引入数据库,但至少我更接近分辨率。