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

XML to Linq value from childnode from same parents are together

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

首先,您可以调用 ToList() 让 LINQ 查询 return 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子句修改为return个单独的<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

当您执行 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;