Оператор ?.
не поддерживается в TypeScript версии 2.0.
Поэтому я использую следующую функцию:
export function o<T>(someObject: T, defaultValue: T = {} as T) : T {
if (typeof someObject === 'undefined' || someObject === null)
return defaultValue;
else
return someObject;
}
использование выглядит следующим образом:
o(o(o(test).prop1).prop2
plus, вы можете установить значение по умолчанию:
o(o(o(o(test).prop1).prop2, "none")
Он отлично работает с IntelliSense в Visual Studio.
Другой подход - использовать XSLT:
$xsl = <<< XSL
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<items>
<xsl:copy-of select="//item">
<xsl:apply-templates/>
</xsl:copy-of>
</items>
</xsl:template>
</xsl:stylesheet>
XSL;
В приведенной выше таблице стилей есть только одно правило, а именно глубокое копирование всех элементов
из исходного XML в XML-файл и игнорируйте все остальное из исходного файла. Узлы будут скопированы в элемент
для корневого узла. Чтобы обработать это, вы должны сделать
$xslDoc = new DOMDocument(); // create Doc for XSLT
$xslDoc->loadXML($xsl); // load stylesheet into it
$xmlDoc = new DOMDocument(); // create Doc for RSS
$xmlDoc->loadXML($xml); // load your XML/RSS into it
$proc = new XSLTProcessor(); // init XSLT engine
$proc->importStylesheet($xslDoc); // load stylesheet into engine
echo $proc->transformToXML($xmlDoc); // output transformed XML
Вместо вывода вы можете просто записать возвращаемое значение в файл.
Дополнительная литература:
То, о чем вы просите, вряд ли можно назвать преобразованием. По сути, вы просто извлекаете элементы
как они есть. Кроме того, полученный вами результат не является корректным XML, поскольку в нем отсутствует корневой узел.
Кроме того, можно поступить следующим образом:
$dom = new DOMDocument; // init new DOMDocument
$dom->loadXML($xml); // load some XML into it
$xpath = new DOMXPath($dom); // create a new XPath
$nodes = $xpath->query('//item'); // Find all item elements
foreach($nodes as $node) { // Iterate over found item elements
echo $dom->saveXml($node); // output the item node outerHTML
}
Вышеприведенный результат выводит узлы
. Вы можете просто буферизовать вывод, конкатенировать его в строку, записать в него массив, имплодировать и т.д. - и записать его в файл.
Если вы хотите сделать это правильно с DOM (и корневым узлом), полный код будет выглядеть так:
$dom = new DOMDocument; // init DOMDocument for RSS
$dom->loadXML($xml); // load some XML into it
$items = new DOMDocument; // init DOMDocument for new file
$items->preserveWhiteSpace = FALSE; // dump whitespace
$items->formatOutput = TRUE; // make output pretty
$items->loadXML('<items/>'); // create root node
$xpath = new DOMXPath($dom); // create a new XPath
$nodes = $xpath->query('//item'); // Find all item elements
foreach($nodes as $node) { // iterate over found item nodes
$copy = $items->importNode($node, TRUE); // deep copy of item node
$items->documentElement->appendChild($copy); // append item nodes
}
echo $items->saveXML(); // outputs the new document
Вместо saveXML()
, вы бы использовали save('filename.xml')
для записи в файл.
Попытка:
<?php
$xmlFile = new DOMDocument(); //Instantiate new DOMDocument
$xmlFile->load("URL TO RSS/XML FILE"); //Load in XML/RSS file
$xmlString = file_get_contents("URL TO RSS/XML FILE");
$title[] = "";
$description[] = "";
$link[] = "";
$pubDate[] = "";
$guid[] = "";
for($i = 0; $i < substr_count($xmlString, "<item>"); $i++)
{
$title[] = $xmlFile->getElementsByTagName("title")->item(0)->nodeValue; //Get the value of the node <title>
$description[] = $xmlFile->getElementsByTagName("description")->item(0)->nodeValue;
$link[] = $xmlFile->getElementsByTagName("link")->item(0)->nodeValue;
$pubDate[] = $xmlFile->getElementsByTagName("pubDate")->item(0)->nodeValue;
$guid[] = $xmlFile->getElementsByTagName("guid")->item(0)->nodeValue;
}
?>
Не проверено, но массивы
$title[] $description[] $link[] $pubDate[] $guid[]
должны быть заполнены всеми данными, которые вам нужны!
EDIT: OK, другой подход:
<?php
$xmlString = file_get_contents("URL TO RSS/XML FILE");
$titles = preg_filter("/<title>([.]*)</title>/","\\1", mixed $xmlString);
$descriptions = preg_filter("/<description>([.]*)</description>/","\\1", mixed $xmlString);
$links = preg_filter("/<link>([.]*)</link>/","\\1", mixed $xmlString);
$pubDates = preg_filter("/<pubDate>([.]*)</pubDate>/","\\1", mixed $xmlString);
$guids = preg_filter("/<guid>([.]*)</guid>/","\\1", mixed $xmlString);
?>
В этом примере каждая переменная будет заполнена правильными значениями.