0

这是我的 XML:

<?xml version="1.0"?>
<formatlist>
<format>
    <formatName>WHC format</formatName>
    <delCol>ID</delCol>
    <delCol>CDRID</delCol>
    <delCol>TGIN</delCol>
    <delCol>IPIn</delCol>
    <delCol>TGOUT</delCol>
    <delCol>IPOut</delCol>
    <srcNum>SRCNum</srcNum>
    <distNum>DSTNum</distNum>
    <connectTime>ConnectTime</connectTime>
    <duration>Duration</duration>
</format>
<format>
    <formatName existCombineCol="1">Umobile format</formatName>   //this format
    <delCol>billing_operator</delCol>
    <hideCol>event_start_date</hideCol>
    <hideCol>event_start_time</hideCol>
    <afCombineName dateType="DateTime" format="dd/MM/yyyy HH:mm:ss">  //node i want
        <name>ConnectdateTimeAFcombine</name>
        <combineDate>event_start_date</combineDate>
        <combineTime>event_start_time</combineTime>
    </afCombineName>
    <afCombineName dateType="DateTime" format="dd/MM/yyyy HH:mm:ss">  //node i want
        <name>aaa</name>
        <combineDate>bbb</combineDate>
        <combineTime>ccc</combineTime>
    </afCombineName>
    <modifyPerfixCol action="add" perfix="60">bnum</modifyPerfixCol>
    <srcNum>anum</srcNum>
    <distNum>bnum</distNum>
    <connectTime>ConnectdateTimeAFcombine</connectTime>
    <duration>event_duration</duration>
</format>
</formatlist>

我想用 Umobile 格式查找格式,然后遍历这两个节点。

<afCombineName dateType="DateTime" format="dd/MM/yyyy HH:mm:ss">  //node i want
    <name>ConnectdateTimeAFcombine</name>
    <combineDate>event_start_date</combineDate>
    <combineTime>event_start_time</combineTime>
</afCombineName>
<afCombineName dateType="DateTime" format="dd/MM/yyyy HH:mm:ss">  //node i want
    <name>aaa</name>
    <combineDate>bbb</combineDate>
    <combineTime>ccc</combineTime>
</afCombineName>

并列出所有两个节点的子节点。结果应该是这样的:

ConnectdateTimeAFcombine,event_start_date,event_start_time.
aaa,bbb,ccc

我怎样才能做到这一点?

4

4 回答 4

0
foreach(var children in format.Descendants())

  {

     //Do something with the child nodes of format.
  }
于 2013-03-31T06:31:48.940 回答
0

这样您就可以访问这些元素:

var doc = System.Xml.Linq.XDocument.Load("PATH TO YOUR XML FILE");
var result = doc.Descendants("format")
            .Where(x => (string)x.Element("formatName") == "Umobile format")
            .Select(x => x.Element("afCombineName"));

然后你可以这样迭代result

foreach (var item in result)
{
    string format = item.Attribute("format").Value.ToString();
    string name = item.Element("name").Value.ToString();
    string combineDate = item.Element("combineDate").Value.ToString();
    string combineTime = item.Element("combineTime").Value.ToString();
}
于 2013-03-31T06:51:23.040 回答
0

对于所有与 XML 相关的遍历,您应该习惯使用 XPath 表达式。这是非常有用的。即使您可以在特定情况下做一些更简单的事情,使用 XPath 也是一种很好的做法。这样,如果您的方案在某个时候发生变化,您只需更新您的 XPath 表达式,您的代码就会启动并运行。

对于一个完整的例子,你可以看看这篇文章

于 2013-03-31T06:43:54.613 回答
0

您可以将 System.Xml 命名空间 API 与 System.Xml.XPath 命名空间 API 一起使用。这是一个快速算法,可以帮助您完成任务:

  1. 使用以下 XPATH获取包含字符串Umobile 格式的文本节点:

    XmlNode umobileFormatNameNode = document.SelectSingleNode("//formatName[text()='Umobile format']");

  2. 现在 umobileFormatNameNode 的父节点将是您感兴趣的节点:

    XmlNode formatNode = umobileFormatNameNode.ParentNode;

  3. 现在获取该节点的子节点:

    XmlNodeList afCombineFormatNodes = formatNode.SelectNodes("afCombineName");

  4. 您现在可以处理 afCombineFormatNodes 列表

    for(XmlNode xmlNode in afCombineNameFormtNodes) { //进程节点 }

于 2013-03-31T06:44:53.370 回答