2016-03-21 73 views
0

我有下面的XML文件无法读取XML由于父节点

<eConnect xmlns:dt="urn:schemas-microsoft-com:datatypes"> 
    <SOPTransactionType> 
    <eConnectProcessInfo> 
     <ConnectionString>Data Source=DGLSQL1;Initial Catalog=dgl;Persist Security Info=False;Integrated Security=SSPI</ConnectionString> 
     <EConnectProcsRunFirst>True</EConnectProcsRunFirst> 
    </eConnectProcessInfo> 
    <taSopLotAuto_Items> 
     <taSopLotAuto> 
     <SOPTYPE>2</SOPTYPE> 
     <SOPNUMBE>435462</SOPNUMBE> 
     <LNITMSEQ>16384</LNITMSEQ> 
     <ITEMNMBR>7740</ITEMNMBR> 
     <LOCNCODE>18</LOCNCODE> 
     <QUANTITY>65</QUANTITY> 
     <LOTNUMBR>15483D0104X68X</LOTNUMBR> 
     </taSopLotAuto> 
    </taSopLotAuto_Items> 
    </SOPTransactionType> 
</eConnect> 

我使用下面的代码读取该文件

XmlDocument doc = new XmlDocument(); 
doc.Load("C:\\SOP.XML"); 
XmlNodeList nodes = doc.SelectNodes("/taSopLotAuto_Items/taSopLotAutoka"); 
foreach (XmlNode node in nodes) 
{  
    string text = node["SOPTYPE"].InnerText; 
    Console.WriteLine(text + "\n"); 
} 

在这里,我想读的<taSopLoAuto>内容。但我无法阅读文件内容。这是因为文档中写了几行?请帮我解决问题。

+1

'taSopLotAuto_Items'不是XML中的顶级项目,并且'taSopLotAutoka'甚至不存在。重写您的XPath。 – Tomalak

+0

看看这个http://stackoverflow.com/questions/30279306/read-from-xml-files-with-or-without-a-namespace-using-xmldocument –

回答

0

命名空间是一个问题。您可以像下面那样使用Linq

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml = 
       "<eConnect xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">" + 
        "<SOPTransactionType>" + 
        "<eConnectProcessInfo>" + 
         "<ConnectionString>Data Source=DGLSQL1;Initial Catalog=dgl;Persist Security Info=False;Integrated Security=SSPI</ConnectionString>" + 
         "<EConnectProcsRunFirst>True</EConnectProcsRunFirst>" + 
        "</eConnectProcessInfo>" + 
        "<taSopLotAuto_Items>" + 
         "<taSopLotAuto>" + 
         "<SOPTYPE>2</SOPTYPE>" + 
         "<SOPNUMBE>435462</SOPNUMBE>" + 
         "<LNITMSEQ>16384</LNITMSEQ>" + 
         "<ITEMNMBR>7740</ITEMNMBR>" + 
         "<LOCNCODE>18</LOCNCODE>" + 
         "<QUANTITY>65</QUANTITY>" + 
         "<LOTNUMBR>15483D0104X68X</LOTNUMBR>" + 
         "</taSopLotAuto>" + 
         "<taSopLotAuto>" + 
         "<SOPTYPE>2</SOPTYPE>" + 
         "<SOPNUMBE>435462</SOPNUMBE>" + 
         "<LNITMSEQ>16384</LNITMSEQ>" + 
         "<ITEMNMBR>7740</ITEMNMBR>" + 
         "<LOCNCODE>18</LOCNCODE>" + 
         "<QUANTITY>65</QUANTITY>" + 
         "<LOTNUMBR>15483D0104X68X</LOTNUMBR>" + 
         "</taSopLotAuto>" + 
         "<taSopLotAuto>" + 
         "<SOPTYPE>2</SOPTYPE>" + 
         "<SOPNUMBE>435462</SOPNUMBE>" + 
         "<LNITMSEQ>16384</LNITMSEQ>" + 
         "<ITEMNMBR>7740</ITEMNMBR>" + 
         "<LOCNCODE>18</LOCNCODE>" + 
         "<QUANTITY>65</QUANTITY>" + 
         "<LOTNUMBR>15483D0104X68X</LOTNUMBR>" + 
         "</taSopLotAuto>" + 
        "</taSopLotAuto_Items>" + 
        "</SOPTransactionType>" + 
       "</eConnect>"; 

      XDocument doc = XDocument.Parse(xml); 
      List<XElement> taSopLotAutos = doc.Descendants() 
       .Where(x => x.Name.LocalName == "taSopLotAuto") 
       .ToList(); 

      var results = taSopLotAutos.Select(x => new 
      { 
       sopType = (int)x.Element("SOPTYPE"), 
       sopNumbe = (int)x.Element("SOPNUMBE"), 
       lnitmsseg = (int)x.Element("LNITMSEQ"), 
       locncode = (int)x.Element("LOCNCODE"), 
       quantity = (int)x.Element("QUANTITY"), 
       lotnumbr = (string)x.Element("LOTNUMBR") 
      }).ToList(); 
     } 
    } 
} 
+0

谢谢。假设我有相同根名下的多个记录,我怎样才能使用循环来迭代它们。 – Babar

+0

哪个标签重复多个记录?我不知道你的记录是什么意思。 – jdweng

+0

他们只有一个tage ** **,它的孩子出现在文件中。如果这个标签重复,我怎么能这样做。 – Babar