我编写了linq代码,因此我可以从父节点读取子节点。我得到了两个子节点值,但它显示为一个长字符串。如何拆分价值?
这是我的XML调用函数:
var wsinputs = new List<string>();
wsinputs = readXMLInput(2);
这是我的功能:
public List<string> readXMLInput(int seq)
{
XElement xelement = XElement.Load(@"C:\Users\XXXXX\XXXX\selection.xml");
IEnumerable<XElement> selectedServiceList = xelement.Elements();
var inputtype = new List<string>();
int countnum = selectedServiceList.Descendants("seq").Count();
// for (int x = 1; x <= countnum; x++)
// {
IEnumerable<string> serviceinputs = from servinput in xelement.Elements("Service")
let inp = (string)servinput.Element("inputs")
orderby inp
// where (string)servinput.Element("seq") == seq.ToString()
select inp;
foreach (string zp in serviceinputs)
{
inputtype.Add(zp);
}
//}
return inputtype;
}
这是我得到的输出:
System.IntSystem.Int
我需要得到:
System.Int
System.Int
节点值应该分开。
这是我的xml:
<SelectedService>
<Service>
<servicename>updatemapInt</servicename>
<seq>1</seq>
<serviceURL>http://XXX.XXXX.net/Service1.svc?wsdl</serviceURL>
<inputs>
<input>System.Int</input>
<input>System.Int</input>
</inputs>
<Output>System.String</Output>
</Service>
<Service>
答案 0 :(得分:1)
首先,您可以调用ToList()
让LINQ查询返回List<T>
而不是IEnumerable<T>
。然后,对于主要问题,您可以像这样使用双form
子句:
List<string> serviceinputs = (from service in xelement.Elements("Service")
from servinput in service.Element("inputs").Elements("input")
let inp = (string)servinput
orderby inp
select inp).ToList();
或修改单个from
子句以单独返回单个<input>
值:
List<string> serviceinputs = (from servinput in xelement.Elements("Service")
.Elements("inputs")
.Elements("input")
let inp = (string)servinput
orderby inp
select inp).ToList();
<强> dotnetfiddle demo
强>
输出
System.Int
System.Int
答案 1 :(得分:0)
执行servinput.Element("inputs")
时,您会立即获得节点<inputs>
的所有内容(这就是您将System.IntSystem.Int
单个字符串作为输出的原因。为了将<input>
节点分开,您可以执行以下操作:
IEnumerable<string> serviceinputs = from inputs in xelement.Elements("Service")
.Elements("inputs")
.Elements("input")
orderby inputs.Value
select inputs.Value;
如果您想进行更多过滤,可以轻松完成:
IEnumerable<string> serviceinputs = from servinput in xelement.Elements("Service")
where (string)servinput.Element("seq") == seq.ToString()
from inputs in servinput.Elements("inputs").Elements("input")
orderby inputs.Value
select inputs.Value;