2014-11-08 17 views
6

我有几个千兆字节的XML。 XML中没有空格。如何在PowerShell中使用XmlReader来传输大/巨大的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 2014-11-08 21:03:00

+1

@edelwater:在开关选项周围加入括号固定它。 – Wouter 2014-11-13 15:33:55