2017-08-27 9 views
1

xmlファイルから約10 000のデータベースエントリをインポートする必要がありますが、xsdファイルのデータ構造を使用すると、xsdファイルを正しくインポートしてxmlデータをインポートできますか?私はPHPを使用します。xsdデータ構造からxmlデータを解析しますか?

これは私のXSDスキーマです:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- edited with XMLSpy v2010 rel. 3 (x64) (http://www.altova.com) --> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="shopInformations"> 
     <xs:annotation> 
      <xs:documentation>All products</xs:documentation> 
     </xs:annotation> 
     <xs:complexType> 
      <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
       <xs:element name="productInformation"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="title" type="xs:string"/> 
          <xs:element name="author" type="xs:string"/> 
          <xs:element name="productcode" type="xs:string" minOccurs="0"/> 
          <xs:element name="content"/> 
          <xs:element name="sections"> 
           <xs:complexType> 
            <xs:sequence maxOccurs="unbounded"> 
             <xs:element name="section"> 
              <xs:complexType> 
               <xs:sequence> 
                <xs:element name="title"/> 
               </xs:sequence> 
               <xs:attribute name="id" type="xs:string" use="required"/> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
         <xs:attribute name="type" use="required"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:enumeration value="public"/> 
            <xs:enumeration value="reseller"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:attribute> 
         <xs:attribute name="version" type="xs:string" use="required"/> 
         <xs:attribute name="lang" use="required"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:enumeration value="en"/> 
            <xs:enumeration value="es"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:attribute> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

私のxmlファイルには、450メガバイトの周りに持っていると私はそれを開くことができません...

+1

な方法であることが必要になり、値をキャストする必要があるかもしれません見通しのコード!私はあなたが 'DOMDocument'を使用してノードを反復することができますが、データを見ずに誰も実際に答えを提供することはできません。 – RamRaider

+0

現在持っているコードを追加できますか?誰もがあなたのためのコードを書くつもりはありません。 –

+0

@NigelRen xsdの例を追加してDOMDocumentを試しましたが、xmlをインポートするためのマップとしてxsdを使用する方法が見つかりませんでした。 – nowilius

答えて

0

詳細は少し漠然としているように、私は非常に推測しなければなりませんでしたそのような大きなファイルを読み込むには、XMLReaderを使用する方がよいでしょう。 XMLReaderを使用すると、ファイル全体を一度に読み取るのではなく、セグメント単位でファイルを読み取ることができます。

次のコードは、データを読み取る簡単な方法を示していますが、XSDからいくつかのテストデータを作成する必要があったため、正確には正しくない可能性があります。

<?php 
error_reporting (E_ALL); 
ini_set ('display_errors', 1); 

$xml = new XMLReader; 
$xml->open('t1.xml'); 
while($xml->read()) { 
    if($xml->name == "productInformation") { 
     $product = $xml->readOuterXML(); 
     $prod = new SimpleXMLElement($product); 
     echo "title=".$prod->title.PHP_EOL; 
     echo "author=".$prod->author.PHP_EOL; 
     echo "productcode=".$prod->productcode.PHP_EOL; 
     echo "content=".$prod->content.PHP_EOL; 
     foreach ($prod->sections->section as $section) { 
      echo "section id=".$section['id'].PHP_EOL; 
      echo "section title=".$section->title.PHP_EOL; 
     } 

     echo PHP_EOL; 
     $xml->next(); 
    } 
} 

あなたはSimpleXMLを返す値を使用しようとしている場合、あなたはとても$prod->title文字列フィールドに割り当てられているときのスニペット広すぎない(string)$prod->title

+0

つまり、xsdファイルを直接使用することなく簡単にxmlを読むことができますか? – nowilius

+0

xsdファイルは、xmlファイルに準拠する必要のあるものだけを定義するものです。これを使用してXMLを検証できますが、XMLを読む必要はありません。 –

関連する問題