2016-01-12 1 views
0

Я повсюду искал и не могу найти ничего, что могло бы мне помочь.Сложно читать XML из веб-сервиса C#

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

Вот отрывок из возвращенного XML:

<?xml version="1.0"?> 
<MobilePortalSellingCategoriesHierarchy xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Response xmlns="http://blabla.com/service/">Successful</Response> 
    <ResponseNumber xmlns="http://blabla.com/service/">0</ResponseNumber> 
    <SellingCategoriesHierarchy xmlns="http://tym2sell.com/PortalService/"> 
    <Response>Successful</Response> 
    <ResponseNumber>0</ResponseNumber> 
    <SellingCategories> 
     <PortalSellingCategory> 
     <SellingCategoryId xsi:nil="true" /> 
     <SellingCategoryName>category1</SellingCategoryName> 
     <DeliveryMethod /> 
     <DeliveryMethodNumber>0</DeliveryMethodNumber> 
     <SellingCategories> 
      <PortalSellingCategory> 
      <SellingCategoryId xsi:nil="true" /> 
      <SellingCategoryName>category1_Item</SellingCategoryName> 
      <DeliveryMethod /> 
      <DeliveryMethodNumber>0</DeliveryMethodNumber> 
      <SellingCategories> 
       <PortalSellingCategory> 
       <SellingCategoryId>2</SellingCategoryId> 
       <SellingCategoryName>Item2</SellingCategoryName> 
       <DeliveryMethod>Display</DeliveryMethod> 
       <DeliveryMethodNumber>1</DeliveryMethodNumber> 
       <VoucherValue>0.00</VoucherValue> 
       <IsVariablePrice>true</IsVariablePrice> 
       <MinimumVoucherValue>1.00</MinimumVoucherValue> 
       <MaximumVoucherValue>1000.00</MaximumVoucherValue> 
       <VoucherValueIncrement>1.00</VoucherValueIncrement> 
       <AdditionalInputItems> 
        <PortalAdditionalInputItem> 
        <InputItemId>-1</InputItemId> 
        <Label>Value:</Label> 
        <IsNumericOnly>true</IsNumericOnly> 
        <MaximumLength>7</MaximumLength> 
        <Hidden>false</Hidden> 
        </PortalAdditionalInputItem> 
        <PortalAdditionalInputItem> 
        <InputItemId>4</InputItemId> 
        <Label>Mobile Number</Label> 
        <IsNumericOnly>true</IsNumericOnly> 
        <MaximumLength>15</MaximumLength> 
        <Hidden>false</Hidden> 
        </PortalAdditionalInputItem> 
       </AdditionalInputItems> 
       <TwoStep>false</TwoStep> 
       <SelectedIcon>SamplePicture</SelectedIcon> 
       <UnSelectedIcon>SamplePicture</UnSelectedIcon> 

Это повторяется от узла SellingCategories только под ответ на пару раз. Вот фрагмент моего кода, где я получаю XML как строку.

 XmlDocument xml = new XmlDocument(); 
     xml.LoadXml(receivedData); 

     XmlNodeList xnList = xml.SelectNodes("/MobilePortalSellingCategoriesHierarchy"); 
     foreach (XmlNode xn in xnList) 
     { 
      string sellingCategoryName = xn["SellingCategoryName"].InnerText; 
      string SelectedIcon = xn["SelectedIcon"].InnerText; 
      string UnSelectedIcon = xn["UnSelectedIcon"].InnerText; 
      richTextBox1.AppendText(string.Format("Name: {0} {1} {2}", sellingCategoryName, SelectedIcon, UnSelectedIcon)); 
     } 

Я попытался изменить xml.SelectNodes("/MobilePortalSellingCategoriesHierarchy"); к xml.SelectNodes("/MobilePortalSellingCategoriesHierarchy/SellingCategoriesHierarchy/SellingCategories/PortalSellingCategory");

нужно выбрать каждый SellingCategoryName и список SellingCategoryName (ы) и все остальные элементы под ним.

я надеялся получить что-то в строках:

category1

Category1_Item

Элемент2

SamplePicture

Пример изображения

Mine читает только первый Узел, а затем возвращает «Успешный» мне.

Я havve также пытался:

XElement root = XElement.Load("FilePath"); 
       var sellingCategoryNames = from PortalSellingCategory in root.Elements("MobilePortalSellingCategoriesHierarchy") 
              where (string)PortalSellingCategory.Element("SellingCategoriesHierarchy").Element("SellingCategories").Element("PortalSellingCategory") != "" 
              select PortalSellingCategory; 
       foreach (var xEle in sellingCategoryNames) 
       { 
        richTextBox1.Text = (string)xEle; 
       } 

Любая помощь будет принята с благодарностью.

+1

Я бы * сильно * рекомендую использовать LINQ to XML здесь. Я подозреваю, что это пространства имен, которые запутывают вас для начала, а LINQ to XML упрощает пространство имен. Затем вы, похоже, ищете «SellingCategoryName» непосредственно в «MobilePortalSellingCategoriesHierarchy», тогда как на самом деле имеется несколько слоев ... –

ответ

0

Что вы делаете с

xml.SelectNodes("/MobilePortalSellingCategoriesHierarchy"); 

выбирает корневой узел, который является только один. Вот почему вы получаете только один элемент в своем списке. Важна ли иерархия? Я вижу, что PortalSellingCategory также может быть внутри другой PortalSellingCategory. Если нет, возможно, вы можете попробовать следующее выбрать:

xml.SelectNodes("//PortalSellingCategory"); 

Это будет искать для каждого узла с именем «PortalSellingCategory» в своем ответе, не Mather не где в иерархии она.

РЕДАКТИРОВАТЬ: И да, вы должны следить за пространствами имен, sry for не видел этого. Если вы хотите geeting всех узлов с XPath, вы должны создать новый NamespaceManager и на него свой SelectNodes звоните:

XmlDocument xml = new XmlDocument(); 
    xml.LoadXml(data); 

    XmlNamespaceManager ns = new XmlNamespaceManager(xml.NameTable); 
    ns.AddNamespace("ns", "http://tym2sell.com/PortalService/"); 

    XmlNodeList xnList = xml.SelectNodes("//ns:PortalSellingCategory", ns); 
+0

Я подозреваю, что OP также нужно будет указать пространства имен, хотя ... и все это более легко выполняется в LINQ to XML, без необходимости в XPath. –

+0

«Перечисление не дало никаких результатов» –

+0

отредактировал мой ответ. И да, Linq, вероятно, будет лучше, но я думаю, что, по крайней мере, попробуйте это, чтобы проверить, как это работает, хорошо ... если это отстой после этого, вы все равно можете перейти на Linq. Но в конце дня вы все еще знаете более одного метода для решения этой проблемы. –

0

Я хотел бы использовать XElement вместо XMLDocument, а затем использовать Linq для запроса или выбрать elmements как : XElement xContact = ....

int contactno = (int?) XContact.Элемент («команда»). Элемент («контактный»). Атрибут («contactpersonid»)? -1; (Команда

если (xContact.Element ("команда"). Элемент ("ContactPerson"). Элемент ("имя"). Элемент ("Firstname")! = NULL) Console.WriteLine (xContact.Element " ") .Element (" ContactPerson ") Элемент (." название ") Элемент (". Firstname ") Значение).

0
var doc= new XmlDocument(); 
    doc.Load("FilePath"); 
    var nodeList = xml.GetElementsByTagName("PortalSellingCategory"); 

Привет,

Он возвращает коллекцию узлов, и вы просто должны запросить его, чтобы получить необходимую информацию. Не стесняйтесь спрашивать о помощи при необходимости.

Dimitri.