C# 使用LINQ解析XML节点和子节点
我有一个类似的XMLC# 使用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 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
}
}