使用C#从xmls创建XML

时间:2018-05-23 20:08:35

标签: c# xml xelement

我有一个XML文件。我正在寻找帮助从这个xml文件创建多个xml文件。新的xml将具有相同EmpID的所有节点。我使用C#代码并且能够创建xmls Xml看起来像这样 -

<?xml version="1.0" encoding="utf-8"?>
      <Connected>
      <Emp>
          <A.EMPLID>1</A.EMPLID>
          <A.Phone>12##</A.Phone>
      </Emp>
      <Emp>
          <A.EMPLID>1</A.EMPLID>
          <A.Add>XXXXXXX</A.Add>
      </Emp>
      <Emp>
          <A.EMPLID>2</A.EMPLID>
         <A.Phone>##34</A.Phone>
      </Emp>
      <Emp>
         <A.EMPLID>3</A.EMPLID>
      </Emp>
      <Emp>
         <A.EMPLID>3</A.EMPLID>
         <A.Add>XXXXXXX</A.Add>
     </Emp>
    </Connected>

3种不同的EmplId输出将是3种不同的Xml

1.XML

 <Connected>
     <Emp>
      <A.EMPLID>1</A.EMPLID>
      <A.Phone>12##</A.Phone>
     </Emp>
    <Emp>
      <A.EMPLID>1</A.EMPLID>
      <A.Add>XXXXXXX</A.Add>
    </Emp>
</Connected>

2.XML

  <Connected>
      <Emp>
      <A.EMPLID>2</A.EMPLID>
      <A.Phone>##34</A.Phone>
      </Emp>
  </Connected>

3.XML

 <Connected>
     <Emp>
         <A.EMPLID>3</A.EMPLID>
     </Emp>
     <Emp>
         <A.EMPLID>3</A.EMPLID>
         <A.Add>XXXXXXX</A.Add>
     </Emp>
 </Connected>

我正在尝试使用C#代码。使用XElement

      XElement x = new XElement("Connected",new XElement("Emp",new XElement("A.EMPLID", group.Key),group.Select(g => g.Elements().Where(e =>e.Name != "A.EMPLID"))));

但它创造了这样的东西:

<?xml version="1.0" encoding="utf-8"?>
<Connected>
<Emp>


<A.EMPLID>1</A.EMPLID>


<A.Phone>12##</A.Phone>


<A.Add>XXXXXXX</A.Add>


</Emp>


</Connected>   

我需要为Empld生成3个xml,但节点应该完全相同。

2 个答案:

答案 0 :(得分:1)

使用xml linq:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string ident = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Connected></Connected>";

            XDocument doc = XDocument.Load(FILENAME);

            var groups = doc.Descendants("Emp").GroupBy(x => (string)x.Element("A.EMPLID")).ToList();
            foreach (var group in groups)
            {
                XDocument doc1 = XDocument.Parse(ident);
                XElement root = doc1.Root;

                root.Add(group);

                doc1.Save(@"c:\temp\test" + group.Key + ".xml");
            }

        }
    }
}

答案 1 :(得分:0)

实现这一目标的另一种方法是使用XPath。

var empElements = xmlDocument.SelectNodes("//Emp[A.EMPLID=1]");

以上查询将返回所有&lt; Emp&gt;属于特定ID的节点(在本例中为1)。