C# 使用LINQ解析XML节点和子节点

C# 使用LINQ解析XML节点和子节点,c#,xml,linq,linq-to-xml,silverlight-5.0,C#,Xml,Linq,Linq To Xml,Silverlight 5.0,我有一个类似的XML <?xml version="1.0" encoding="UTF-8"?> <e_schema> <schema_name value="shema1"> <contact> <id>1</id> <firstName>firstname1</firstName> <lastN

我有一个类似的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>
但我不知道如何用电话号码读取节点 有人能给我一个提示或一行代码我怎么能做到这一点

\u phonenumbers=子元素.子元素(“电话号码”)
_phonenumbers = subelement.Descendants("telephone_number")
                          .Select(x => 
                                 new List<string>() {
                                     (string)x.Element("number1"), 
                                     (string)x.Element("number2"),
                                     (string)x.Element("number3")
                           });
.选择(x=> 新名单(){ (字符串)x.Element(“number1”), (字符串)x.Element(“number2”), (字符串)x元素(“数字3”) });
\u phonenumbers=子元素。子元素(“电话号码”)
.选择(x=>
新名单(){
(字符串)x.Element(“number1”),
(字符串)x.Element(“number2”),
(字符串)x元素(“数字3”)
});

我假设
\u phonenumbers
是某种集合,例如
IEnumerable

代码使用linq表达式为每个号码创建一个
PhoneInfo
实例,并查找相应的重试次数和号码类型


需要注意的是:xml结构非常糟糕,最好将所有数字都放在
标记中,实际数字是内容和类型重试,类型数据是该节点的属性。

我假设
\u phonenumbers
是某种集合,例如
IEnumerable

代码使用linq表达式为每个号码创建一个
PhoneInfo
实例,并查找相应的重试次数和号码类型


需要注意的是:xml结构非常糟糕,最好将
标记中的所有数字都放在一起,实际数字是内容和类型重试,类型数据是该节点的属性。

我认为您需要在“contact”元素中循环通过“telephone\u 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

我认为您需要通过“联系人”元素中的“电话号码”元素进行循环

以下是您可以尝试的代码:

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。元素(“电话号码”)。子元素()将为您带来“电话号码”标记中的所有标记。然后您可以使用它们的
属性。
subelement.Element(“电话号码”)。子体()
将为您提供“电话号码”标记内的所有标记。您可以使用它们的
属性。谢谢,我尝试了您的示例,但我坚持使用“e.Name.StartsWith”我没有“StartsWith”!抱歉,我以为
Name
属性是一个字符串,而不是。必须插入
LocalName
才能获取字符串。请参阅我的编辑。谢谢,我尝试了你的示例,但我坚持使用“e.Name.StartsWith”我没有“StartsWith”!抱歉,我以为
Name
属性是一个字符串,而不是。必须插入
LocalName
才能获取字符串。请参阅我的编辑。
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
        }

    }