2015-06-15 45 views
-1

我在Visual Studio中有一个程序,它在XML文件中给出输出。它看起来像这样:在C#中更改XML文件格式#

<?xml version="1.0" encoding="utf-8"?> 
<leaCEDS> 
    <district> 
    <leaID>01</leaID> 
    <name>Alachua</name> 
    <organizationType>LEA</organizationType> 
    <streetLine1>620 E University Ave</streetLine1> 
    <city>Gainesville</city> 
    <stateProvince>FL</stateProvince> 
    <postalCode>326015448</postalCode> 
    <county>Alachua</county> 
    <NCESID_district>1200030</NCESID_district> 
    <date_created>2015-06-01T20:38:58.9730000</date_created> 
    <date_updated>2015-06-01T20:38:58.9730000</date_updated> 
    </district> 
</leaCEDS> 

现在我已经被告知,我需要有以这种格式保存的XML文件的输出..

<leaCEDS xlmns="http://specification.sifassociation.org/Implementation/na/3.2/html/CEDS/K12/K12_leaCEDS.html#LinkD"> 
    <districtEntry> 
     <identification> 
      <leaId>0001</leaId> 
      <name>Alachua County Public Schools</name> 
      <organizationType>LEA</organizationType> 
     </identification> 
     <addressList> 
      <address> 
       <street> 
        <line1>620 East University Avenue</line1> 
        <line2></line2> 
       </street> 
       <city>Gainsville</city> 
       <stateProvince>FL</stateProvince> 
       <postalCode>32601-5448</postalCode> 
       <county>Alachua</county> 
      </address> 
     </addressList> 
     <district> 
      <reference> 
       <NCESID>1200030</NCESID> 
      </reference> 
     </district> 
    </districtEntry> 
<leaCEDS> 

我会怎么做呢?我试图寻找一些解决方案,但没有真正找到任何东西。也许一个解决方案是使用XSLT?我真的不相信我所要求的是正确的XML文件格式,但这是我必须要做的。

这是我的程序看起来像澄清。

XML Program

+0

是的,这是哪门子事XSLT的用于制成。但它是一种完整的语言,所以准备花一些时间学习。 – adv12

+0

如果你有一个已经生成XML文件的现有程序,你不能只研究代码是如何生成该XML,然后修改它来做你正在寻找的? –

+0

哦!这是我没有仔细阅读的结果。当然,如果你控制编写输出的程序,只需按照@BryanHarrington的建议将其保存为新格式。 – adv12

回答

1

这听起来像你的XML是直接从你的数据库,这意味着你需要把它改造成基于你目前的结构别的东西来了。

虽然您可以学习XSLT,但您也可以使用LINQ to XML来执行此操作,查询已解析的文档以获取新格式所需的内容。例如:

var d = doc.Descendants("district").Single(); 

XNamespace ns = "http://specification.sifassociation.org/Implementation/na/3.2/html/CEDS/K12/K12_leaCEDS.html#LinkD"; 

var transform = new XDocument(
    new XElement(ns + "leaCDS", 
     new XElement(ns + "districtEntry", 
      new XElement(ns + "identification", 
       new XElement(ns + "leaID", (string)d.Element("leaID")), 
       new XElement(ns + "name", (string)d.Element("name")), 
       new XElement(ns + "organizationType", (string)d.Element("organizationType")) 
       ), 
      new XElement(ns + "addressList", 
       new XElement(ns + "address", 
        new XElement(ns + "street", 
         new XElement(ns + "line1", (string)d.Element("streetLine1")), 
         new XElement(ns + "line2") 
         ), 
        new XElement(ns + "city", (string)d.Element("city")), 
        new XElement(ns + "stateProvince", (string)d.Element("stateProvince")), 
        new XElement(ns + "postalCode", (string)d.Element("postalCode")), 
        new XElement(ns + "county", (string)d.Element("county")) 
        ) 
       ), 
      new XElement(ns + "district", 
       new XElement(ns + "reference", 
        new XElement(ns + "NCESID", (string)d.Element("NCESID_district")) 
        ) 
       ) 
      ) 
     ) 
    ); 

transform.Save(writer); 

看到这里工作的例子:https://dotnetfiddle.net/ZM27LX

+0

如果我有超过1个分区条目,我会循环吗?另外,我看到你将xml编码为'var xml'。我会只使用'XDocument.Load'加载一个文件,然后使用像你所显示的转换? –

+0

上面的代码就是你要使用的 - 假设'doc'已经存在,就像它在你的代码中对你的问题的评论一样。如果你有多个“区域”,那么是的,你需要遍历源文档中的那些。 –

+0

'var d = doc.Descendants(“district”)。Single();'它在这一行上给出错误。 “序列包含多个元素”。我可能会在错误的地方使用代码。我发布了我的代码在OP中的样子。 –