簡體   English   中英

XML使用LINQ解析節點和子節點

[英]XML parse nodes and subnodes with LINQ

我確實有類似這樣的XML

<?xml version="1.0" encoding="UTF-8"?>
<e_schema>
    <schema_name value="shema1">
        <contact>
            <id>1</id>
            <firstName>firstname1</firstName>
            <lastName>lastname1</lastName>
            <department>IT</department>
            <emailAddress>lastname1@mydomain.com</emailAddress>
            <lineManagerId>22331470</lineManagerId>
            <telephone_number>
                <number1>0000000000</number1>
                <number2>1111111111</number2>
                <number3>2222222222</number3>
                <retries1>2</retries1>
                <retries2>1</retries2>
                <retries3>2</retries3>
                <numberType1>Mobile</numberType1>
                <numberType2>Fixnet</numberType2>
                <numberType3>Fixnet</numberType3>
            </telephone_number>
        </contact>
        <contact>
            <id>2</id>
            <firstName>firstname2</firstName>
            <lastName>lastname2</lastName>
            <department>SUPPORT</department>
            <emailAddress>lastname2@mydomain.com</emailAddress>
            <lineManagerId>22331470</lineManagerId>
            <telephone_number>
                <number1>3333333333</number1>
                <number2>4444444444</number2>
                <number3>5555555555</number3>
                <retries1>2</retries1>
                <retries2>1</retries2>
                <retries3>2</retries3>
                <numberType1>Mobile</numberType1>
                <numberType2>Fixnet</numberType2>
                <numberType3>Fixnet</numberType3>
            </telephone_number>
        </contact>
    </schema_name>
</e_schema>

現在,使用這段代碼,我閱讀了每個聯系人節點並將其添加到列表中

    var xmlcontacts = xmlloaded.Descendants("schema_name").Where(node => (string)node.Attribute("value") == comboSchema.SelectedValue.ToString());

    foreach (XElement subelement in xmlcontacts.Descendants("contact")) //element is variable
    {

        contact.Add(new Contact()
         {
             id = subelement.Element("id").Value,
             firstName = subelement.Element("firstName").Value,
             lastName = subelement.Element("lastName").Value,
             department = subelement.Element("department").Value,
             emailAddress = subelement.Element("emailAddress").Value,
             lineManagerId = subelement.Element("lineManagerId").Value,
             //_phonenumbers = phones
         });

    }

但是我不知道我如何讀取帶有phone_number的節點,有人可以給出提示或一行代碼,我該怎么做!

我假設_phonenumbers是某種集合,例如IEnumerable<PhoneInfo>

_phoneNumbers = subelement.Element("telephone_number").Elements()
                .Where(e => e.Name.LocalName.StartsWith("number").Select(e => 
                new PhoneInfo
                {
                  Number = e.Value,
                  Retries = subelement.Element("telephone_Number").Element(
                  "retries" + e.Name.LocalName.SubString(5)).Value,
                  NumberType = subelement.Element("telephone_Number").Element(
                  "numbertype" + e.Name.LocalName.SubString(5)).Value
                })

該代碼使用linq表達式為每個號碼創建一個PhoneInfo實例,並查找相應的重試和號碼類型。

注意:xml結構非常糟糕,最好將所有數字都放在<number>標記中,而實際數字是該節點的內容和類型重試,而類型數據是該節點的屬性。

_phonenumbers = subelement.Descendants("telephone_number")
                          .Select(x => 
                                 new List<string>() {
                                     (string)x.Element("number1"), 
                                     (string)x.Element("number2"),
                                     (string)x.Element("number3")
                           });

我認為您需要通過“聯系”元素內的“ telephone_number”元素進行循環。

下面是您可以嘗試的代碼:

var xmlcontacts = xmlloaded.Descendants("schema_name").Where(node => (string)node.Attribute("value") == comboSchema.SelectedValue.ToString());

    foreach (XElement subelement in xmlcontacts.Descendants("contact")) //element is variable
    {

        contact.Add(new Contact()
        {
            id = subelement.Element("id").Value,
            firstName = subelement.Element("firstName").Value,
            lastName = subelement.Element("lastName").Value,
            department = subelement.Element("department").Value,
            emailAddress = subelement.Element("emailAddress").Value,
            lineManagerId = subelement.Element("lineManagerId").Value,
            //_phonenumbers = phones
        });
        foreach (XElement phoneElement in subelement.Descendants("telephone_number"))
        {
            //add telephone_number details in list here
        }

    }

我剛剛在“聯系”循環中添加了一個foreach

暫無
暫無

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

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