2014-11-08 22 views
6

Birkaç gigabayt XML'im var. XML'de boşluk yoktur. Büyük/büyük XML dosyalarını yayınlamak için XmlReader'ı PowerShell'de nasıl kullanabilirim?

Yani çünkü ben temelde, sonra PowerShell ile sonuçlanan dosyaları ayrıştırmak

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; 
        } 
       } 
      } 

(bazı şeyler mesela Testlerde randomizing gerçekleştirmek için bazı ek kod olan) tek dosyalarda bölmek için biraz C# kodu yazdım Özellikleri değişirken sunucu üzerinde çalışmayı daha kolay bulup, komut satırını değiştirebilirim.

Öyleyse ... yukarıdakileri PowerShell'e dönüştürmenin en kolay yolu nedir? sadece bir satırda "<cust" ve sonraki satırda "omer>" olması durumunda bayt için bayt okumalı mıyım?

cevap

8

Bu PowerShell yapmak istediğini oldukça yakın olmalıdır:

$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

if ($ f.NodeType -eq [Sisteml ,,,) bir anahtarı taşımak zorunda kaldı ve ilginç PowerShell vardı içinde C# öğesinin aksini kullanmak için kullanılır. – edelwater

+1

@edelwater: Anahtarın etrafında parantez ekleme seçeneği sabitlenmiştir. – Wouter

İlgili konular