2014-12-29 2 views
0

내 C# 응용 프로그램에 문제가 있습니다. 첫 번째 노드의 속성 만 가져올 수 있으며 다음 노드의 속성을 가져올 수 없습니다.xml 속성이 검색되지 않습니다.

는 XML이 형식에 ..

<ALLPRODUCTS> 
    <PRODUCT ITEM="1"> 
    <QUANTITY>5</QUANTITY> 
    </PRODUCT> 
    <PRODUCT ITEM="2"> 
    <QUANTITY>6</QUANTITY> 
    </PRODUCT>.... 

응용 프로그램은 하나 같이 첫 번째 제품 번호를 가져옵니다과 5의 양을 가지고 ...하지만 그것은 단지 양을 제공하고 항목을 말한다 그 후 number가 null입니다. 여기에 코드 메신저 첫 번째 후 제품 ID로 null을 받고있는 이유 ...

while (reader.Read()) 
     { 
      if (reader.Name.Equals("PRODUCT")) 
      { 
       String id; 
       String qty;     

       try 
       { 

        id = reader.GetAttribute("ITEM"); 
        reader.ReadToFollowing("QUANTITY"); 
        qty = reader.ReadInnerXml(); 

        if (qty.Equals("0")) 
        { 
         oos++; 
        } 
        else 
        { 
         inStock++; 
        } 

        status.Refresh(); 
        stockLevelList.Add(id, qty); 

       } 
       catch (Exception e) 
       { 
        MessageBox.Show(e.Message, e.Source, MessageBoxButtons.OK, MessageBoxIcon.Error); 
       } 

      } 

사람이 제안 할 수 있습니다 사용?

+0

XML이 거대한 (즉, 25Mb보다 큼) 경우가 아니라면이 종류의 작업을 위해 XmlDocument 및 SelectNodes와 같은 DOM 메소드를 사용하는 것이 더 나을 것입니다. –

+0

'reader.MoveToNextAttribute()'를하고 이름을 검사하여 그것이'ITEM'인지 확인하고 싶습니다. 만약 그렇다면'reader.Value'를 호출해서 그것을 얻을 수 있습니다. 이 경우 XML 판독기를 사용하지 않고 일부 POCO에서 XML 직렬화를 사용하기 만합니다. 피투성이가 될 수 있습니다. – TyCobb

+0

제목을 편집했습니다. "제목에"태그 "를 포함해야합니까?] (http://meta.stackexchange.com/questions/19190/) "일치 의견은"아니오, 그들은해서는 안됩니다. " –

답변

1

독자가 요소의 시작 부분에 있는지 확인하고 있지 않습니다. PRODUCT의 끝 요소를 기반으로 처리하려고하므로 코드가 폭발적입니다.

"PRODUCT"가 확인되는 if 문 바로 뒤에이 체크를 추가하십시오.

if (reader.Name.Equals("PRODUCT")) 
{ 
    if (!reader.IsStartElement()) 
     continue; 

    // Your normal processing code here. 
} 

이것은 무엇 때문에 XmlReader을 다소 고통스럽게합니다. 그것은 당신이 어디에있을 수 있는지에주의를 기울일 필요가 있다는 것을 의미하는 모든 단일 요소를 횡단합니다. 처음으로 시작 요소에 있습니다. 당신은 처리하고 모든 것이 좋지만, 여전히 "PRODUCT"이라는 이름의 </PRODUCT> 요소에 도달하면 그것이 떨어져 버립니다.

다음은 reader을 앞으로 이동시키는 코드를 기반으로 한 순서입니다. 첫 번째 요소에

  • reader.Read() 이동 : ALLPRODUCTS
  • 다시 그렇게 reader.Read()을 찾고 있었다 더 내부 텍스트가 없기 때문에 노드 유형 Whitespace를 발견하지 무슨.
  • reader.Read()
  • 당신은 속성을 가져온 다음 QUANTITY에게 책을 읽어 그것을 말해 PRODUCT
  • 로 이동. (다시 돌아갈 수는 없습니다. 주문 관련 사항)
  • reader.Read()PRODUCT으로 이동합니다. 이것은 <PRODUCT>이 아닙니다. </PRODUCT>입니다.
  • 코드는 이제 다시 위의 과정의 대부분을 시작하지만 <PRODUCT>

편집에 있지 않았기 때문에 실패 또한 XmlReader와 becareful. XmlReader이 특정 시점까지 작동하려면 XML이 반드시 유효 할 필요는 없습니다. 문제가 발생하면 오류가 발생하고 그 시점에서 이미 수백 개의 노드를 처리했을 수 있습니다.

+0

@FearghalConn 마우스를 이동하여 값을 확인하면 바로 문제를 발견했습니다. 모든 'Read()'가 끝나면 "EndElement"라고 말했고, 디버거는 당신의 친구입니다;) – TyCobb

관련 문제