2016-03-18 124 views
0

我的input.xml文件中像下面:如何从xml中获取特定节点的所有值?

<Root Details="false"> 
    <Product count="45" Name="Success"> 
     <Project Id="420" Title="First"/> 
     <Main Id="220" Title="Last"/> 
     <Status> 
     <Maintainance Id="123" Title="Good"> 
      <Maintain Id="ABC" /> 
      <Maintain Id="DEF" /> 
      <Maintain Id="GHI" /> 
     </Maintainance> 
     <Maintainance Id="456" Title="Better"> 
      <Maintain Id="JKL" /> 
      <Maintain Id="MNO" /> 
      <Maintain Id="PQR" /> 
     </Maintainance> 
     <Maintainance Id="789" Title="Bad"> 
      <Maintain Id="STU" /> 
      <Maintain Id="VWX" /> 
      <Maintain Id="XYZ" /> 
     </Maintainance> 
     </Status> 
     <Main Id="420" Title="Failure"/> 
     <Project Id="220" Title="First"/> 
    </Product> 
</Root> 

我只需要功能节点值和输出XML像下面: 即我需要输出就像下面的Output.xml

<Root Details="false"> 
    <Product count="45" Name="Success"> 
    <Maintainance Id="123" Title="Good"> 
      <Maintain Id="ABC" /> 
      <Maintain Id="DEF" /> 
      <Maintain Id="GHI" /> 
     </Maintainance> 
     <Maintainance Id="456" Title="Better"> 
      <Maintain Id="JKL" /> 
      <Maintain Id="MNO" /> 
      <Maintain Id="PQR" /> 
     </Maintainance> 
     <Maintainance Id="789" Title="Bad"> 
      <Maintain Id="STU" /> 
      <Maintain Id="VWX" /> 
      <Maintain Id="XYZ" /> 
     </Maintainance> 
    </Product> 
</Root> 

分享此任何想法。提前致谢。我正在通过使用xmldocument来查找输出。告诉我通过使用xmldocument获取输出。

+0

你到目前为止用XmlDocument试过了什么?你可以发布你的当前代码,为什么它不工作? – ManoDestra

回答

0

使用指定的XmlDocument的快速和肮脏的解决方案。可能是这样做的更好的方法,但这里你去...

using System; 
using System.Collections.Generic; 
using System.Xml; 
using System.Xml.Linq; 

namespace XmlDocumentTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       XmlDocument doc = new XmlDocument(); 
       doc.Load(@"C:\java\xml\root.xml"); 
       var root = doc.DocumentElement; 
       var productNode = root.FirstChild; 
       var elementsToRemove = new List<XmlElement>(); 
       foreach (XmlElement element in root.GetElementsByTagName("Project")) 
       { 
        elementsToRemove.Add(element); 
       } 

       foreach (XmlElement element in root.GetElementsByTagName("Main")) 
       { 
        elementsToRemove.Add(element); 
       } 

       var maintList = new List<XmlElement>(); 
       foreach (XmlElement element in root.GetElementsByTagName("Maintainance")) 
       { 
        maintList.Add(element); 
       } 

       foreach (XmlElement element in maintList) 
       { 
        var newNode = element.CloneNode(true); 
        element.ParentNode.ParentNode.AppendChild(newNode); 
       } 

       foreach (XmlElement element in root.GetElementsByTagName("Status")) 
       { 
        elementsToRemove.Add(element); 
       } 

       foreach (XmlElement element in elementsToRemove) 
       { 
        element.ParentNode.RemoveChild(element); 
       } 

       Console.WriteLine("Xml: " + doc.OuterXml); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e); 
      } 

      while (Console.ReadKey(true).Key != ConsoleKey.Escape) 
      { 
      } 
     } 
    } 
} 

P.S.维护应拼写维护:)

0

试试这个。类似于昨天的回答。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml = 
       "<Root Details=\"false\">" + 
        "<Product count=\"45\" Name=\"Success\">" + 
         "<Project Id=\"420\" Title=\"First\"/>" + 
         "<Main Id=\"220\" Title=\"Last\"/>" + 
         "<Status>" + 
         "<Maintainance Id=\"123\" Title=\"Good\">" + 
          "<Maintain Id=\"ABC\" />" + 
          "<Maintain Id=\"DEF\" />" + 
          "<Maintain Id=\"GHI\" />" + 
         "</Maintainance>" + 
         "<Maintainance Id=\"456\" Title=\"Better\">" + 
          "<Maintain Id=\"JKL\" />" + 
          "<Maintain Id=\"MNO\" />" + 
          "<Maintain Id=\"PQR\" />" + 
         "</Maintainance>" + 
         "<Maintainance Id=\"789\" Title=\"Bad\">" + 
          "<Maintain Id=\"STU\" />" + 
          "<Maintain Id=\"VWX\" />" + 
          "<Maintain Id=\"XYZ\" />" + 
         "</Maintainance>" + 
         "</Status>" + 
         "<Main Id=\"420\" Title=\"Failure\"/>" + 
         "<Project Id=\"220\" Title=\"First\"/>" + 
        "</Product>" + 
       "</Root>"; 

      XDocument doc = XDocument.Parse(xml); 
      List<XElement> maintainances = doc.Descendants("Maintainance").ToList(); 
      XElement product = doc.Descendants("Product").FirstOrDefault(); 
      product.ReplaceWith(new XElement("Product", product.Attributes())); 
      product = doc.Descendants("Product").FirstOrDefault(); 
      foreach (XElement maintainance in maintainances) 
      { 
       product.Add(maintainance); 
      } 
     } 
    } 
}