Я не очень разбираюсь в PHP, но я унаследовал PHP-скрипт, который я хотел бы преобразовать в powershell. Я не уверен, возможно ли это. Но похоже, что скрипт получает список продуктов в виде XML из службы. Затем он выполняет некоторое удаление кода cr / lf, заменяя несколько символов кавычек, а затем преобразует xml в json. Кажется, довольно прямо. Я не очень разбираюсь в PowerShell, поэтому я надеялся, что это будет простая задача для кого-то здесь.
<?php
$fileContents= file_get_contents("http://svc.mysite.com/api/GetItems");
$fileContents = str_replace(array("\n", "\r", "\t"), '', $fileContents);
$fileContents = trim(str_replace('"', "'", $fileContents));
$simpleXml = simplexml_load_string($fileContents);
$map = json_decode(json_encode($simpleXml));
print json_encode($map->item);
?>
Вот образец данных XML
<?xml version="1.0" encoding="utf-8" ?>
<items xmlns="http://svc.tricorbraun.com/api/GetItems" version="1">
<item><ItemID>000072</ItemID><ItemName>Dropper Tip Closure</ItemName><ItemGroup>Closures</ItemGroup><Shape>Round</Shape><Style>Fitment/Plug</Style></item>
<item><ItemID>000182</ItemID><ItemName>28-480, P/P Push and Turn Closure</ItemName><ItemGroup>Closures</ItemGroup><Shape>Round</Shape><Style>Child Resistant</Style></item>
<item><ItemID>000187</ItemID><ItemName>28-480, P/P Child Resistant Closure</ItemName><ItemGroup>Closures</ItemGroup><Shape>Round</Shape><Style>Child Resistant</Style></item>
<item><ItemID>000190</ItemID><ItemName>28mm SPEC, P/P Dispensing Closure</ItemName><ItemGroup>Closures</ItemGroup><Shape>Round</Shape><Style>Dispensing</Style></item>
</items>
Я придумал это, но если произойдет сбой с «Неожиданной ошибкой пространства имен»
$doc = New-Object System.Xml.XmlDocument
$memStream = new-object System.IO.MemoryStream
$jsonWriter = [System.Runtime.Serialization.Json.JsonReaderWriterFactory]::CreateJsonWriter($memStream)
$doc.Load("http://svc.mysite.com/api/GetItems")
$doc.Save($jsonWriter)
$bytes = $memStream.ToArray()
[System.Text.Encoding]::UTF8.GetString($bytes,0,$bytes.Length)
Write-Output $jsonWriter.ToString()
Нам нужно увидеть ответ от этой строки:
$fileContents= file_get_contents("http://svc.mysite.com/api/GetItems");
Можете ли вы запустить следующее в PowerShell и выдать результаты в PasteBin или где-нибудь еще?
Invoke-WebRequest "http://svc.mysite.com/api/GetItems" |
Export-CLIXMl C:\temp\pathTo.XML
После того, как вы это сделаете, общие задачи заключаются в том, чтобы удалить эти символы: «\ n», «\ r», «\ t», что легко, и заменить двойные кавычки на одинарные, что легко. PowerShell имеет команду ConvertFrom-Json, что также упрощает этот аспект.
Если вы ответите в ответ с примером вывода из кода PowerShell, который я дал выше, я могу помочь вам разобраться с остальными.
Спасибо за ответ с полным типом файла.
Предполагая, что у нас есть вывод .xml в текстовом файле .xml, этот процесс даст вам объекты JSON, все с PowerShell. Это действительно довольно просто.
[xml]$string = get-content C:\temp\Pathto.xml
$string.items.Item | Select-Object Item*,Shape,Style | ConvertTo-Json
Выход
[
{
"ItemID": "000072",
"ItemName": "Dropper Tip Closure",
"ItemGroup": "Closures",
"Shape": "Round",
"Style": "Fitment/Plug"},
{
"ItemID": "000182",
"ItemName": "28-480, P/P Push and Turn Closure",
"ItemGroup": "Closures",
"Shape": "Round",
"Style": "Child Resistant"},
{
"ItemID": "000187",
"ItemName": "28-480, P/P Child Resistant Closure",
"ItemGroup": "Closures",
"Shape": "Round",
"Style": "Child Resistant"},
{
"ItemID": "000190",
"ItemName": "28mm SPEC, P/P Dispensing Closure",
"ItemGroup": "Closures",
"Shape": "Round",
"Style": "Dispensing"}
]
Я не работаю с JSOn на ежедневной основе, но это, безусловно, выглядит для меня как действительный конверт JSON и контент, и он проверяется на http://jsonlint.com/
Еще одна вещь. Скорее всего, вы можете заменить первую строку на
[xml]$string = Invoke-WebRequest "http://svc.mysite.com/api/GetItems"
Других решений пока нет …