2014-11-25 3 views
1

Мне нужно получить идентификатор пользователя соответствующего идентификатора терминала. любая помощь. Но это дает ошибку:чтение 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 ('using (XmlReader reader') – kennyzx

+1

Анализ XML-документа с использованием' XmlReader' очень неэффективен. Считаете ли вы использование 'XDocument' или' XPath' «всего несколько строк кода, или вам нужно придерживаться« XmlReader »? – kennyzx

+1

@kennyzx -« неэффективный »- это интересный термин для быстрого анализа XML с использованием классов, которые являются частью сети. Сложнее получить право, чем XDocument/XmlDocument - действительно ... –

ответ

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": - иначе вы бы пропустить правильный элемент и, а также удалены ReadToFollowing("USER-ID") из цикла в то время - это ОКЕЙ идти в элемент только один раз.

Но, как сказал @kennyzx, гораздо проще разбирать xml с помощью XDoccument.

UPDATE Я не уверен, что о вашей схеме, но если это возможно, для элемента строки, чтобы не иметь идентификатор пользователя, то с ReadToFollowing можно перейти к элементу следующего доступного «ID пользователя», даже если он не находится в одном элементе «Row». Поэтому во втором случае лучше использовать ReadToNextSibling.

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