2015-04-21 3 views
0

У меня есть сторонний xml, который я пытаюсь проанализировать.Получить pseudo xml внутри структуры xml

Вопрос аналогичен this one тем, что я ищу, чтобы получить код псевдо xml, закодированный внутри одного из элементов. Однако мне нужен другой результат.

Вот XML, который возвращается:

HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 

    <?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> 
     <PostApplication_V6Response xmlns="http://xxxService.org/"> 
      <PostApplication_V6Result>string</PostApplication_V6Result> 
     </PostApplication_V6Response> 
     </soap:Body> 
    </soap:Envelope> 

Я использую Linq для XML - Я могу вернуть элемент <PostApplication_V6Result> - это lowesst элемент в дереве я могу получить.

Используя этот код:

var name = "{http://xxxService.org/}PostApplication_V6Result"; 

    var soap = XDocument.Parse(result) 
     .Descendants(name) 
     .First(); 

Тем не менее, значение, содержащееся внутри этого элемента является своего рода псевдо XML - не XML, но XML-двойник.

Вот что содержится внутри:

<xxxService> 
    <Application> 
     <Status>Accepted</Status> 
     <RedirectUrl>http://www.google.com?abc=123</RedirectUrl> 
     <Value>100</Value> 
    </Application> 
</xxxService> 

Я пробовал почти все, чтобы получить данные, но я получаю либо неверный символ «=» ошибки или данные в корневом недействительном сообщении.

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

public static T Deserialise<T>(this XElement element) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 

    using (var reader = element.CreateReader()) 
    { 
     return (T)serializer.Deserialize(reader); 
    } 
} 

Любая помощь оценивается.

UPDATE

Вот полный XML Thats returned-, как вы можете видеть, что внутренняя часть фактически является HTML не XML.

<soap:body><postapplication_v6response xmlns="http://xxxService.org/"><postapplication_v6result>&lt;xxxService&gt; 
&lt;Application&gt; 
&lt;Status&gt;PURCHASED&lt;/Status&gt; 
&lt;RedirectURL&gt;http://www.google.com?test=abc&amp;xyz=123&lt;/RedirectURL&gt; 
&lt;/Application&gt; 
&lt;/xxxService&gt; 
</postapplication_v6result></postapplication_v6response></soap:body></soap:envelope> 
+0

вы можете разместить полный xml? похоже, что ваш сервис не возвращает действительный xml? – Ewan

+0

, если содержимое узла представляет собой строку, содержащую символы xml, вы должны обернуть ее в [CData] или убрать ее – Ewan

+0

@Ewan - добавлен код Ewan - как вы можете видеть, внутренняя часть - html, а не xml. –

ответ

0

побочного эффект декодирования всей строки, некоторые XML специальных символы (& символа в данном случае), которые должны быть закодированы, они получают декодируется в результате недопустимый XML. Для этого простого случая, заменяющего & с &amp; следует исправить:

var xml = @"<PostApplication_V6Result> 
&lt;xxxService&gt; 
&lt;Application&gt; 
&lt;Status&gt;PURCHASED&lt;/Status&gt; 
&lt;RedirectURL&gt;http://www.google.com?test=abc&amp;xyz=123&lt;/RedirectURL&gt; 
&lt;/Application&gt; 
&lt;/xxxService&gt; 
</PostApplication_V6Result>"; 
var soap = XElement.Parse(xml); 

var rawContent = HttpUtility.HtmlDecode(soap.FirstNode.ToString().Trim()) 
          .Replace("&", "&amp;"); 
var content = XElement.Parse(rawContent); 

Изменить код для кодирования other XML special characters при необходимости.

+0

Спасибо вам за помощь - har07, у вас есть окончательный и полный ответ, который работает, но Ewan вы тоже получите от меня. –

+0

hmmm. Я бы побеспокоил, что xml! = Html с экранированными амперсандами. но почему html в первую очередь ?! – Ewan

1

Вот пример. (Я выломал пространства имен):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web; 
using System.Xml.Linq; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace UnitTestProject2 
{ 
    [TestClass] 
    public class Class7 
    { 
     [TestMethod] 
     public void xmltest() 
     { 
      string xml = @"<body><postapplication_v6response><postapplication_v6result>&lt;xxxService&gt; 
&lt;Application&gt; 
&lt;Status&gt;PURCHASED&lt;/Status&gt; 
&lt;RedirectURL&gt;http://www.google.com?test=abc&amp;xyz=123&lt;/RedirectURL&gt; 
&lt;/Application&gt; 
&lt;/xxxService&gt; 
</postapplication_v6result></postapplication_v6response></body>"; 

      XDocument doc = XDocument.Parse(xml); 
      string encodedhtml = doc.Descendants("postapplication_v6result") 
        .First().Value; 

      string decodedhtml = HttpUtility.HtmlDecode(encodedhtml); 

      Console.WriteLine(decodedhtml); 
     } 
    } 
} 
+0

Ewan, пожалуйста, см. мой последний ответ. У меня есть результат, но для его использования нужен синтаксический анализ. –

+0

вам нужна библиотека анализатора html. плохо посмотрите – Ewan

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