2014-11-25 2 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 문서의 내용은 주어진 이름과 그 요소 안에 이동합니다 다음 Read와 가장 가까운 요소에

<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

무엇이 오류입니까? (XmlReader reader') – kennyzx

+1

XmlReader를 사용하여 XML 문서를 파싱하는 것은 매우 비효율적입니다 .XDocument 또는 XPath를 사용하는 것이 좋습니다. xmlReader'를 고수해야만합니까? – kennyzx

+1

@kennyzx - "비효율적 인"은 네트워크의 일부인 클래스를 사용하여 XML을 구문 분석하는 가장 빠른 방법에 대한 흥미로운 용어입니다 .XDocument보다 더 어려워졌습니다./XmlDocument - 참으로 ... –

답변

1

ReadToFollowing를 탐색하다 - 직선 텍스트. 따라서 두 경우 모두 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에 따르면 XDocument를 사용하여 xml을 구문 분석하는 것이 훨씬 간단합니다.

UPDATE 내가 당신의 스키마에 대한 확실하지 오전하지만이 가능한 경우 행 요소가 사용자 ID가없는 데, 다음 ReadToFollowing으로 사용 가능한 다음 '사용자 ID'요소를 건너 뛸 수도 있습니다, 동일한 '행'요소에 있지 않더라도 마찬가지입니다. 따라서 두 번째 경우에는 ReadToNextSibling을 사용하는 것이 좋습니다.

관련 문제