Разделить 1 XML на несколько после определенного тега, используя PHP

0

Я хочу разбить 1 XML файл на несколько меньших, всегда из тега. Как только PHP станет единственным языком, который я знаю немного, я решил его использовать.

Моя попытка выглядит так:

$xnl_file = "xml.xml";
$xml = simplexml_load_file($xnl_file);
$my_file = 0;
foreach ($xml as $value){

    $CountryOrganizationId = "<CountryOrganizationId>".$xml->Partnership->CountryOrganizationId."</CountryOrganizationId>";
    $PartnershipId = "<PartnershipId>".$xml->Partnership->PartnershipId."</PartnershipId>";
    $OwnerId = "<OwnerId>".$xml->Partnership->OwnerId."<OwnerId>";
    $PartnerIdList = "<PartnerIdList><String>".$xml->Partnership->PartnerIdList->String."</String></PartnerIdList>";
    $CountryOrganizationId_contact = "<Contract><CountryOrganizationId>".$xml->Partnership->Contract->CountryOrganizationId."</CountryOrganizationId>";
    $ContractId = "<ContractId>".$xml->Partnership->Contract->CountryOrganizationId."</ContractId>";
    $Role = "<LaborRateList><LaborRateDetail><Role>".$xml->Partnership->LaborRateList->LaborRateDetail->Role."</Role>";
    $Category = "<Category>".$xml->Partnership->LaborRateList->LaborRateDetail->Category."</Category>";
    $Rate1 = "<Rate Cur='CZK' Unit='h' MinValue='0' MaxValue='0'>".$xml->Partnership->LaborRateList->LaborRateDetail->Rate."</Rate></LaborRateDetail>";
    echo $OwnerId;
    echo "<br>";
    $my_file = ($my_file + 1).".xml";
    //mkdir("new", 0700); Create subfolder
    $handle = fopen('xml/'.$my_file, 'w') or die('Cannot open file:  '.$my_file); //implicitly creates files in XML folder  
    $data = "<Partnership>".$CountryOrganizationId.$PartnershipId.$OwnerId.$PartnerIdList.$CountryOrganizationId_contact.$ContractId.$Role.$Category.$Rate1."</Partnership>";
    fwrite($handle, $data);  
    }

Как вы можете видеть, я просто загружаю XML файл, а foreach получаю значения и добавляю их в variabiles, а затем снова пытаюсь распечатать. не существует ли какой-то более быстрый способ только CUT при поиске тега Partnership?

Мой XML выглядит так:

<PartnershipList xmlns="URL">
 <Partnership>
  <CountryOrganizationId>CZ</CountryOrganizationId>
  <PartnershipId>Contract_58AB4635-D9C6-A04E</PartnershipId>
  <OwnerId>MM-O-BDD15299</OwnerId>
  <PartnerIdList>
   <String>MM-O-2A10BCF</String>
  </PartnerIdList>
  <Contract>
   <CountryOrganizationId>CZ</CountryOrganizationId>
   <ContractId>Contract_58AB4635-D9C6-A04E</ContractId>
   <LaborRateList>
    <LaborRateDetail>
     <Role>Labor</Role>
     <Category>1</Category>
     <Rate Cur="CZK" Unit="h" MinValue="0" MaxValue="0">250.0</Rate>
    </LaborRateDetail>
    <LaborRateDetail>
     <Role>Paint</Role>
     <Category>2</Category>
     <Rate Cur="CZK" Unit="h" MinValue="0" MaxValue="0">350.0</Rate>
    </LaborRateDetail>
   </LaborRateList>
   <IdBlockCodeList>
    <IDBlockCode>
     <IDBlockCode>51</IDBlockCode>
     <Entry>100</Entry>
    </IDBlockCode>
   </IdBlockCodeList>
   <VehicleKind>Car</VehicleKind>
   <RepairKind>BodyRepair</RepairKind>
   <ManufacturerCode>07</ManufacturerCode>
   <Status>Active</Status>
   <CreatedBy>MM-P-69F997009BBFB4FC2C</CreatedBy>
   <CreationTimeStamp>2014-09-09T15:17:46.000</CreationTimeStamp>
   <UpdatedBy>MM-P-69F997009BBFB4FC2C</UpdatedBy>
   <UpdateTimeStamp>2014-10-15T10:49:18.000</UpdateTimeStamp>
   <FirstVersionContractId>Contract_58AB4635-D9C6-A04E</FirstVersionContractId>
   <OwnerId>MM-O-BDD15299</OwnerId>
   <Manufacturer>07</Manufacturer>
   <VehicleType>Car</VehicleType>
   <VehicleAgeFrom>0</VehicleAgeFrom>
   <VehicleAgeTo>0</VehicleAgeTo>
   <ClaimType>Unknown</ClaimType>
  </Contract>
  <Description>Alfa Romeo</Description>
  <PartnerId>MM-O-2A10BCF</PartnerId>
 </Partnership>
 <Partnership>
  <CountryOrganizationId>CZ</CountryOrganizationId>
  <PartnershipId>Contract_F5134A37-F39A-823A</PartnershipId>
  <OwnerId>MM-O-BDD15299</OwnerId>
  <PartnerIdList>
   <String>MM-O-2A10BCF</String>
  </PartnerIdList>
  <Contract>
   <CountryOrganizationId>CZ</CountryOrganizationId>
   <ContractId>Contract_F5134A37-F39A-823A</ContractId>
   <LaborRateList>
    <LaborRateDetail>
     <Role>Labor</Role>
     <Category>1</Category>
     <Rate Cur="CZK" Unit="h" MinValue="0" MaxValue="0">250.0</Rate>
    </LaborRateDetail>
    <LaborRateDetail>
     <Role>Paint</Role>
     <Category>2</Category>
     <Rate Cur="CZK" Unit="h" MinValue="0" MaxValue="0">350.0</Rate>
    </LaborRateDetail>
   </LaborRateList>
   <IdBlockCodeList>
    <IDBlockCode>
     <IDBlockCode>51</IDBlockCode>
     <Entry>100</Entry>
    </IDBlockCode>
   </IdBlockCodeList>
   <VehicleKind>Car</VehicleKind>
   <RepairKind>BodyRepair</RepairKind>
   <ManufacturerCode>10</ManufacturerCode>
   <Status>Active</Status>
   <CreatedBy>MM-P-69F997009BBFB4FC2C</CreatedBy>
   <CreationTimeStamp>2014-09-09T15:22:27.000</CreationTimeStamp>
   <UpdatedBy>MM-P-69F997009BBFB4FC2C</UpdatedBy>
   <UpdateTimeStamp>2014-10-15T13:11:36.000</UpdateTimeStamp>
   <FirstVersionContractId>Contract_F5134A37-F39A-823A</FirstVersionContractId>
   <OwnerId>MM-O-BDD15299</OwnerId>
   <Manufacturer>10</Manufacturer>
   <VehicleType>Car</VehicleType>
   <VehicleAgeFrom>0</VehicleAgeFrom>
   <VehicleAgeTo>0</VehicleAgeTo>
   <ClaimType>Unknown</ClaimType>
  </Contract>
  <Description>Citroën</Description>
  <PartnerId>MM-O-2A10BCF</PartnerId>
 </Partnership>

Спасибо за любые советы

Теги:

1 ответ

1
Лучший ответ

Если я правильно понимаю, вы хотите создать XML файл для каждого элемента <Partnership>. Это довольно легко с DOM.

Значение xmlns="URL" - это не только URL-адрес - это пространство имен документа. Он определяет формат XML, частью которого являются элементы. Это релевантная информация.

DOM - это все узлы. Все, что содержится в XML-документе, является узлом. Вот узлы элементов, текстовые узлы и многое другое. Xpath позволяет вам выбирать узлы, а DOM имеет методы для создания, клонирования и импорта.

// create a dom and load the xml document
$source = new DOMDocument();
$source->load($xmlFile);
// get an Xpath object and register a prefix for the used namespace
$xpath = new DOMXpath($source);
$xpath->registerNamespace('ps', 'urn:missing-namespace-uri');

// fetch all namespace nodes and iterate them
foreach ($xpath->evaluate('//ps:Partnership') as $index => $partnership) {
  // create a target document
  $target = new DOMDocument();
  // import the partnership node and append it to the target document node
  $target->appendChild($target->importNode($partnership, TRUE));
  // save it
  echo $target->save(($index + 1).'.xml');
}

Подсказка: для построения XML в качестве текста требуется экранирование (htmlspecialchars()). Если вы используете DOM, он позаботится об ускорении для вас.

  • 0
    Привет ThW, спасибо за ваш ответ. Вы понимаете это правильно. Во всяком случае, похоже, я делаю что-то не так. Я копирую ваш код и просто добавляю к нему файл $ xml, чтобы проверить его, и я не получаю вывод. Можете ли вы дать мне немного больше информации? Спасибо
  • 0
    Демо: eval.in/218351 , использует строки, а не файлы. Убедитесь, что вы заменили 'urn:missing-namespace-uri' фактическим пространством имен.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню