2014-11-08 2 views
6

У меня есть XML пары гигабайт. В XML нет пробелов.Как я могу использовать XmlReader в PowerShell для потоковой передачи больших/больших XML-файлов?

Так что я написал небольшую C# код для разделения в отдельных файлах (который имеет дополнительный код для выполнения некоторых вещей, например, рандомизации во время тестирования)

using (XmlReader MyReader = XmlReader.Create(@"d:\xml\test.xml")) 
      { 
       while (MyReader.Read()) 
       { 
        switch (MyReader.NodeType) 
        { 
         case XmlNodeType.Element: 
          if (MyReader.Name == "Customer") 
          { 
           XElement el = XElement.ReadFrom(MyReader) as XElement; 
           if (el != null) 
           { 
            custNumber = (string)el.Element("CustNumber"); 
            output = @"d:\xml\output\" + custNumber; 

            File.WriteAllText(output, el.ToString()); 
           }          
          } 
          break; 
        } 
       } 
      } 

я тогда анализировать полученные файлы с помощью PowerShell, в основном потому, что я проще работать с сервером, тогда как спецификации могут меняться, и я могу на лету сменить сценарий.

Итак ... что является самым простым способом конвертировать вышеуказанное в PowerShell, а также помещать [.Net здесь] раньше всего? должен ли я читать байт для байта только в том случае, если он имеет "<cust" на одной строке и "omer>" на следующем?

ответ

8

Это должно быть очень близко к тому, что вы хотели сделать в Powershell:

$f = [System.Xml.XmlReader]::create("d:\xml\test.xml") 

while ($f.read()) 
{ 
    switch ($f.NodeType) 
    { 
     ([System.Xml.XmlNodeType]::Element) # Make sure to put this between brackets 
     { 
      if ($f.Name -eq "Customer") 
      { 
       $e = [System.Xml.Linq.XElement]::ReadFrom($f) 

       if ($e -ne $null) 
       { 
        $custNumber = [string] $e.Element("CustNumber") 

        $e.ToString() | Out-File -Append -FilePath ("d:\xml\output\"+$e.ToString()) 
       } 
      } 
      break 
     } 
    } 
} 
+0

Если бы переместить переключатель в положение а, если ($ f.NodeType -eq [Syste ,,,) и, что интересно, в PowerShell было для использования. Значение элемента, противоположного C#. – edelwater

+1

@edelwater: добавление скобок вокруг опции переключателя зафиксировано. – Wouter

Смежные вопросы