2014-09-24 4 views
1

나는 웹 서비스에서 검색 한 xml (xml)에서 일부 값을 구문 분석하고 추출하려고 시도했지만이를 반복하는 데 어려움을 겪고 있습니다. 다음은 XML 문자열의 형식은 (미안 그건 조금 밀도) :Linq를 사용하여 XML 값에 액세스하기

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <GetInstantaneousFlowDataResponse xmlns="http://www.NationalGrid.com/EDP/UI/"> 
     <GetInstantaneousFlowDataResult> 
     <ReportName xmlns="http://www.NationalGrid.com/EDP/BusinessEntities/Public">string</ReportName> 
     <PublishedTime xmlns="http://www.NationalGrid.com/EDP/BusinessEntities/Public">dateTime</PublishedTime> 
     <EDPReportPage xmlns="http://www.NationalGrid.com/EDP/BusinessEntities/Public"> 
      <PageName>string</PageName> 
      <CurrentGasDay>dateTime</CurrentGasDay> 
      <EDPEnergyGraphTableCollection> 
      <EDPEnergyGraphTableBE xsi:nil="true" /> 
      <ItemPosition>1</ItemPosition> 
        <EDPObjectCollection>       
         <EDPObjectBE> 
          <EDPObjectName>ALDBROUGH</EDPObjectName> 
          <EnergyDataList> 
           <EDPEnergyDataBE> 
           <ApplicableAt>2014-09-24T12:00:00</ApplicableAt> 
           <FlowRate>0</FlowRate> 
           <QualityIndicator /> 
           <ScheduleTime>2014-09-24T12:12:00</ScheduleTime> 
           </EDPEnergyDataBE> 
          </EnergyDataList> 
         </EDPObjectBE> 
      <EDPEnergyGraphTableBE xsi:nil="true" /> 
      </EDPEnergyGraphTableCollection> 
      <NoteCollection> 
      <EDPNoteBE xsi:nil="true" /> 
      <EDPNoteBE xsi:nil="true" /> 
      </NoteCollection> 
     </EDPReportPage> 
     </GetInstantaneousFlowDataResult> 
    </GetInstantaneousFlowDataResponse> 
    </soap:Body> 
</soap:Envelope> 

내가 나중에 나머지 값을 얻는 순간에 대한 각 보고서의 단지 이름을 얻으려고 노력했다하지만 난 아니에요 왜 작동하지 않는지 확인하십시오. 이것은 내가 작업에 도착 노력 해왔다 코드입니다 : LINQ to XML in VB.NET

답변

0

당신은 누락 : 여기

Dim xmlDoc As XDocument = XDocument.Parse(xml) 

    Dim reports = From flowData In xmlDoc...<EDPObjectBE> _ 
      Select flowData 

    For Each flowData In reports 
     MsgBox(flowData .<EDPObjectName>.Value) 
    Next 

나는 내가 필요에 가장 적합한 것 같았다으로 모방하려고했던 대답은 네임 스페이스 : 당신이 접두어 인 요소와 같은 soap:Envelope이있는 경우

XML로
Dim ns As XNamespace = 
    XNamespace.Get("http://www.NationalGrid.com/EDP/BusinessEntities/Public") 

For Each e As XElement In xmlDoc.Descendants(ns + "EDPObjectBE") 
    Console.WriteLine(e.Element(ns + "EDPObjectName").Value) 
Next 

는, 당신은, http://schemas.xmlsoap.org/soap/envelope/입니다 xmlns:soap의 네임 스페이스를 찾고해야 루트에서 선언 전 n XML. 접두어가 아닌 접두사의 경우 가장 가까운 부모 요소 인 EDPReportPage을 확인하십시오. 여기에 주제에

더 설명 : 당신이 네임 스페이스가 XML 리터럴을 사용하려면

+1

좋아, 이제 작동 모듈의 상단에

는 네임 스페이스를 선언합니다. 고맙습니다! XML 작동 방식에 대해 더 많이 배워야 할 것 같습니다. – Badumtsh

0

네임 스페이스를 가져와야합니다.

Imports <xmlns:ns="http://www.NationalGrid.com/EDP/BusinessEntities/Public"> 

그런 다음 쿼리가된다 :

Dim names = 
    From obj in xml...<ns:EDPObjectBE> 
    Select obj.<ns:EDPObjectName>.Value 
관련 문제