Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Обработка XML
цитата
18/01/13 в 10:41
 Yank
Есть ли решение или стоит самому писать?
Задача - есть ХМЛ с атрибутами.
СмартСидж не берет его. вообщем надо преобразовывать его в ХМЛ без атрибутов на лету.
цитата
18/01/13 в 11:17
 chudoff.a
SimpleXML в пыхе, а для чего тебе именно это надо?
цитата
18/01/13 в 11:36
 Yank
для того что бы СмартСидж мог скушать. SimpleXML по умолчанию есть, или его как-то надо инициировать? <?php // Load and parse the XML document
$rss =  simplexml_load_file('путь к ХМЛ');
$title =  $rss->channel->title;
?>
<html xml:lang="en" lang="en">
<head>
  <title><?php echo $title; ?></title>
</head>
<body>

<h1><?php echo $title; ?></h1>

<?php
// Здесь мы поместим цикл, чтобы включить заголовок элемента и описание
foreach ($rss->channel->item as $item) {
  echo "<h2><a href='". $item->link. "'>". $item->title. "</a></h2>";
  echo "<p>". $item->description. "</p>";
}
?>

</body>
</html> у меня не сработал.
цитата
18/01/13 в 12:24
 chudoff.a
Yank: барин, покаж xml.
цитата
18/01/13 в 13:08
 Yacc
http://php.net/manual/ru/book.xsl.php


index.php
Код:
<?php

$xml = new DOMDocument();
$xsl = new DOMDocument();
$xslt = new XSLTProcessor();

$xml->load('test.xml');
$xsl->load( 'test.xsl', LIBXML_NOCDATA);

$xslt->importStylesheet($xsl);
$xslt->transformToDoc($xml)->save('test2.xml');


test.xml
Код:
<?xml version="1.0" encoding="UTF-8"?>
<chanel>
   <item title="Title1" link="Link1">
      <foo>
         <bar id="id1">bar1</bar>
      </foo>
   </item>
   <item title="Title2" link="Link2">
      <foo>
         <bar id="id2">bar2</bar>
      </foo>
   </item>
</chanel>


Преобразует все атрибуты в элементы:

test.xsl
Код:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:element name="{local-name(.)}">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

test2.xml
<?xml version="1.0" encoding="UTF-8"?>
<chanel>
   <item>
      <title>Title1</title>
      <link>Link1</link>
      <foo>
         <bar>
            <id>id1</id>
            bar1
         </bar>
      </foo>
   </item>
   <item>
      <title>Title2</title>
      <link>Link2</link>
      <foo>
         <bar>
            <id>id2</id>
            bar2
         </bar>
      </foo>
   </item>
</chanel>

Если нужно преобразовать атрибуты только определённых элементов (скажем item), то изменится только одна строка:

test.xsl
Код:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="item/@*">
        <xsl:element name="{local-name(.)}">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

test2.xml
<?xml version="1.0" encoding="UTF-8"?>
<chanel>
   <item>
      <title>Title1</title>
      <link>Link1</link>
      <foo>
         <bar id="id1">bar1</bar>
      </foo>
   </item>
   <item>
      <title>Title2</title>
      <link>Link2</link>
      <foo>
         <bar id="id2">bar2</bar>
      </foo>
   </item>
</chanel>
цитата
18/01/13 в 17:10
 Yank
Спасибо большое!
цитата
29/01/13 в 16:35
 izxus
Использую в PHP для работы с XML два разных способа.
Первый способ.
$xml_parser = xml_parser_create();

Второй способ
$ob=simplexml_load_string($str);

Оба способа позволяют удобно работать с XML
Какой выбрать – дело привычки.
Для сложных документов я предпочитаю xml_parser_create()


Эта страница в полной версии