簡體   English   中英

從 C# 中的屬性獲取 XML 數據

[英]Getting XML data from attributes in C#

我有一個以 XML 格式返回數據的 API。 XML 的相關部分如下所示:

<data name="Rows">
   <data Name="Row">
     <data name="CONTACT">John Smith</data>
     <data name="PHONE1">(555)123-4567</data>
   </data>
   <data Name="Row">
     <data name="CONTACT">Jim Smith</data>
     <data name="PHONE1">(555)123-6754</data>
   </data>
</data>

我可以通過以下方式獲取每行的節點集合:

var query = from item in xdoc.Root.Descendants("data")
            where (string)item.Attribute("Name") == "Row"
            select item;

如果我按屬性過濾,則每個元素的字符串集合:

var query2 = from item in query.Elements("data")
             where (string)item.Attribute("name") == "CONTACT" 
             select item;

returns: John Smith, James Smith

但我不知道如何將每個聯系人姓名和電話號碼放在一起。

就像是:

foreach(var row in query)
{
    contact = query.???;
    phone1 = query.????;
}

您需要使用第一個查詢來獲取行元素的集合。 然后對於每個元素,您需要查找具有所需屬性的子元素:

// Find all elements  <data Name="Row">
var query = from item in xdoc.Root.Descendants("data")
     where (string)item.Attribute("Name") == "Row"
     select item;

// Loop through the elements
foreach(var row in query)
{
    // find child element, that has attribute Name="CONTACT"
    var contactElement = row.Descendants("data")
        .Where(x=>(string)x.Attribute("Name") == "CONTACT")
        .First();
    // find child element, that has attribute Name="PHONE1"
    var phoneElement = row.Descendants("data")
        .Where(x=>(string)x.Attribute("Name") == "PHONE1")
        .First();
    // get values of found elements
    var contact = contactElement.Value;
    var phone1 = phoneElement.Value;
}

上面的代碼假設您將始終擁有所有元素,因此使用函數First() 如果某些元素可能丟失,您需要相應地處理。

由於在您的 XML 中所有節點都是data ,因此使用 Descedants 可能會導致意外結果,因為無論節點在哪里,它都會找到所有節點。 我會一步一步來:-

1)從根節點使用xdoc.Root.Elements("data")找到所有元素,這將為您提供兩個屬性Name作為Row節點。
2) 現在從步驟 1 中檢索到的集合中,找到name屬性為CONTACTPHONE1的第一個data
3) 只需投影步驟 2 中檢索到的項目。

 var res = from item in xdoc.Root.Elements("data")
           let ContactRow = item.Elements("data")
                            .FirstOrDefault(x => (string)x.Attribute("name") == "CONTACT")
           let PHONE1Row = item.Elements("data")
                            .FirstOrDefault(x => (string)x.Attribute("name") == "PHONE1")
           select new
                 {
                    Contact = (string)ContactRow,
                    Phone1 = (string)PHONE1Row
                 };

或使用方法語法:-

 var result = xdoc.Root.Elements("data")
                  .Select(x =>
                       {
                           var ContactRow = x.Elements("data")
                            .FirstOrDefault(z => (string)z.Attribute("name") == "CONTACT");
                           var PHONE1Row = x.Elements("data")
                            .FirstOrDefault(z => (string)z.Attribute("name") == "PHONE1");
                           return new
                                  {
                                     Contact = (string)ContactRow,
                                     Phone1 = (string)PHONE1Row
                                  };
                       });

或者試試這個

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<data name=\"Rows\">" +
                   "<data Name=\"Row\">" +
                     "<data name=\"CONTACT\">John Smith</data>" +
                     "<data name=\"PHONE1\">(555)123-4567</data>" +
                   "</data>" +
                   "<data Name=\"Row\">" +
                     "<data name=\"CONTACT\">Jim Smith</data>" +
                     "<data name=\"PHONE1\">(555)123-6754</data>" +
                   "</data>" +
                "</data>";

            XElement doc = XElement.Parse(xml);

            var results = doc.Descendants().Where(x => (string)x.Attribute("Name") == "Row").Select(x => new {
               contact = x.Elements().Where(y => (string)y.Attribute("name") == "CONTACT").FirstOrDefault().Value,
               phone = x.Elements().Where(y => (string)y.Attribute("name") == "PHONE1").FirstOrDefault().Value,
            }).ToList();
        }
    }
}
​

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM