2014-02-21 4 views
1

Я пытался разобрать некоторую информацию и следовал замечательному совету от http://lakenine.com/reading-xml-with-namespaces-using-linq/ Я уверен, что это близко, но я не получаю никаких результатов для отображения. Нет ошибок, просто никаких результатов. Точки останова и контрольные переменные показывают, что docx имеет правильную информацию, но мой цикл for пропущен прямо. Я играл с несколькими вариантами и удался только сбой кода. Я считаю, что проблема связана с параметром XPathSelectElements, но не знаю, что еще попробовать. На этом этапе мне нужен только токен, но мне нужно будет повторно использовать код для возврата, который может иметь несколько результатов. Пожалуйста посоветуйте и заранее спасибо:разбор SOAP xml с пространствами имен

 string sampleXML = String.Concat(
       "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", 
       " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"", 
       " xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">", 
       " <soap12:Body>", 
       " <BeginSessionV2Response xmlns=\"http://ws.jobboard.com/jobs/\">", 
       " <BeginSessionV2Result>ca5522fb93ef499f8ed010a5f4153af7-446298346-SB-4</BeginSessionV2Result>", 
       " </BeginSessionV2Response>", 
       " </soap12:Body>", 
       " </soap12:Envelope>" 
       ); 

       XmlReader reader = XmlReader.Create(new StringReader(sampleXML)); 
       System.Xml.XmlNameTable nameTable = reader.NameTable; 
       System.Xml.XmlNamespaceManager namespaceManager = new System.Xml.XmlNamespaceManager(nameTable); 

       namespaceManager.AddNamespace("soap12", "http://www.w3.org/2001/XMLSchema-instance/"); 
       XElement docx = XElement.Load(reader); 

       string vbResultz = "start: "; 
       var sessionKey = from pn 
       in docx.XPathSelectElements("soap12:Body/BeginSessionV2Response/BeginSessionV2Result", namespaceManager) 
        select (string)pn; 
         foreach (string pn in sessionKey) 
         { 
          vbResultz += pn; 
         } 

         ViewBag.REsultz = vbResultz;   


     return View(); 
    } 

ответ

0

Во-первых, вы добавили soap12 префикс имеют неправильный URI. Добавить пространства имен namespaceManager таким образом:

namespaceManager.AddNamespace("soap12", "http://www.w3.org/2003/05/soap-envelope"); 
namespaceManager.AddNamespace("ns", "http://ws.jobboard.com/jobs/"); 

Затем вы можете использовать их в выражении XPath, как это:

...... 
docx.XPathSelectElements("soap12:Body/ns:BeginSessionV2Response/ns:BeginSessionV2Result", namespaceManager) 
...... 

Обратите внимание, что <BeginSessionV2Response> имеет пространство имен по умолчанию (XMLNS атрибут без префикса), следовательно, этот элемент, и это потомок без префикса, рассматриваемый в пространстве имен по умолчанию. Поэтому нам нужно добавить префикс ns в выражении запроса XPath выше.

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