来自同一父项的子节点的XML到Linq值在一起

时间:2015-12-26 08:41:34

标签: c# xml linq-to-xml

我编写了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>

2 个答案:

答案 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;