如何在c#中选择XML的后代节点?

时间:2014-02-25 06:24:58

标签: c# xml linq-to-xml

这是我的名为test的XML变量,具有以下XML,

<A>
      <X>
        <B  id="ABC">
          <C name="A" />
          <C name="B" />
          <C name="C" />
          <C name="G" />
        </B>
        <B id="ZYZ">
          <C name="A" />
          <C name="B" />
          <C name="C" />
          <C name="D" />
        </B>
      <X>
</A>

我正在使用以下c#代码

创建result XML变量
var result = new XElement(
                    "Result",
                    new[]
                        {                          
                            new XElement("First",test.Descendants("X"))
                        }
                        );

上面的代码抛出了null异常。

我需要以下输出XML,

<Result>
  <B  id="ABC">
              <C name="A" />
              <C name="B" />
              <C name="C" />
              <C name="G" />
            </B>
  <B id="ZYZ">
              <C name="A" />
              <C name="B" />
              <C name="C" />
              <C name="D" />
  </B>
</Result>

任何帮助表示赞赏! :)

3 个答案:

答案 0 :(得分:2)

您可以尝试这种方式:

var xml = @"<A>
      <X>
        <B  id=""ABC"">
          <C name=""A"" />
          <C name=""B"" />
          <C name=""C"" />
          <C name=""G"" />
        </B>
        <B id=""ZYZ"">
          <C name=""A"" />
          <C name=""B"" />
          <C name=""C"" />
          <C name=""D"" />
        </B>
      </X>
</A>";
var doc = XDocument.Parse(xml);
var newDoc = new XElement("Result", doc.Root.Element("X").Elements());

//this will print the same output as you expect (the 2nd XML in question)
Console.WriteLine(newDoc.ToString());

答案 1 :(得分:1)

<Names>
<Name>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
</Name>
<Name>
    <FirstName>James</FirstName>
    <LastName>White</LastName>
</Name>

要使所有节点都使用XPath表达式/名称/名称。第一个斜杠表示该节点必须是根节点。 SelectNodes方法返回包含节点的集合XmlNodeList。

XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString); // suppose that myXmlString contains "<Names>...</Names>"

XmlNodeList xnList = xml.SelectNodes("/Names/Name");
foreach (XmlNode xn in xnList)
{
 string firstName = xn["FirstName"].InnerText;
 string lastName = xn["LastName"].InnerText;
 Console.WriteLine("Name: {0} {1}", firstName, lastName);
}

答案 2 :(得分:0)

var result = new XElement("Result", test.Descendants("B"));