2014-11-25 94 views
1

我需要獲取用戶ID對應的終端ID。任何幫助。但它給錯誤:使用xml解析器讀取xml

The ReadElementContentAsString method is not supported on node type None. Line 1, position 668.

string strTerminalId = "E"; 
XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(STRING); // 
string strxml = xdoc.OuterXml; 
string strUserName = ""; 
bool Flag = false; 

using (XmlReader reader = XmlReader.Create(new StringReader(strxml))) 
{ 
    while (reader.Read()) 
    { 
     if (reader.IsStartElement()) 
     { 
      switch (reader.Name) 
      { 
       case "Row": 
        reader.Read(); 
        if (Flag == false) 
        { 
         reader.ReadToFollowing("TERM-ID"); 
         reader.Read(); 
         string strTERMID = reader.ReadElementContentAsString().ToString(); 
          if (strTERMID == strTerminalId) 
           { 
            while (reader.ReadToFollowing("NA") && (Flag == false)) 
            { 
             reader.Read(); 
             string strUser = reader.ReadContentAsString(); 
             if (strUser == "NA") 
             { 
              reader.ReadToFollowing("c:value"); 
              reader.Read(); 
              strUserName = reader.ReadContentAsString(); 
              Flag = true; 
             } 
            } 
           } 
          } 
          break; 
        } 
       } 
      } 

XML文檔的內容是

<GetReferenceTableResponse xmlns='http://tempuri.org/'> 
    <GetReferenceTableResult> 
     <Table Name='C' ID='46899' xmlns=''> 
      <Columns> 
      <Col ID='7442' Name='TD' Datatype='T' Length='8' AttributeDescription='Terminal ID' IsKey='Y'/> 
      <Col ID='7443' Name='D' Datatype='T' Length='50' AttributeDescription='Description' IsKey=' '/> 
      <Col ID='7444' Name='U' Datatype='T' Length='8' AttributeDescription='USER-ID' IsKey='' /> 
      </Columns> 
      <Rows> 
       <Row RowsetID=\"1\"> 
        <TERM-ID ID='279598'>A</TERM-ID> 
        <DESC-TXT ID='279622'>ASC</DESC-TXT> 
        <USER-ID ID='279646'>A</USER-ID> 
       </Row> 
      </Rows> 
     </Table> 
    </GetReferenceTableResult> 
</GetReferenceTableResponse> 
+0

什麼是錯誤?請編輯您的問題,提供更多詳細信息,並更好地給出using語句中的所有代碼(使用(XmlReader reader') – kennyzx 2014-11-25 04:17:33

+1

使用'XmlReader'解析xml文檔效率非常低,您是否考慮使用'XDocument'或'XPath' ?只需幾行代碼;或者你必須堅持使用'XmlReader'? – kennyzx 2014-11-25 04:28:58

+1

@kennyzx - 「inefficient」是一個有趣的術語,用於解析使用屬於網絡的類的XML的最快方式。/XmlDocument - 的確... – 2014-11-25 04:32:31

回答

1

ReadToFollowing導航到具有給定名稱和下一Read會去那個元素中最近的元素 - 直到文本。所以在這兩種情況下你都需要ReadContentAsString

在你的情況,將工作:

using (XmlReader reader = XmlReader.Create(new StringReader(strxml))) 
{ 
    while (reader.Read()) 
    { 
     if (reader.IsStartElement()) 
     { 
      switch (reader.Name) 
      { 
       case "Row":      
        if (!Flag) 
        { 
         reader.ReadToFollowing("TERM-ID"); 
         reader.Read(); 
         string strTERMID = reader.ReadContentAsString();       
         if (strTERMID == strTerminalId && reader.ReadToNextSibling("USER-ID")) 
         { 
          reader.Read(); 
          strUserName = reader.ReadContentAsString(); 
          Flag = true; 
         } 
        } 
        break; 
      } 
     } 
    } 
} 

我已經刪除了第一Read只是case "Row":後 - 否則你會錯過合適的元素,以及移除了while循環ReadToFollowing("USER-ID") - 這是什麼?據去只進入元素一次。

但是正如@kennyzx所說 - 使用XDoccument解析xml非常簡單。

UPDATE 我不知道你的方案,但如果它是可能的行元素不具備的用戶ID,然後用ReadToFollowing就可以跳到下一個可用的「用戶ID」元素,即使它不在同一個'Row'元素中。所以最好在第二種情況下使用ReadToNextSibling