2013-04-24 47 views
0

我有这种格式的XML文档:如何转换一个xml文档并插入其他数据?

<?xml version="1.0" encoding="UTF-8"?> 
<person name="Bob" addr_street="123 Fake St" 
     addr_city="Springfield" addr_state="IL"/> 

我想借此数据,并通过我的代码FigureOutZipCode(string city, string state)功能运行。

我会那么喜欢拿这一切的组合数据,并创建一个新的文件格式为:

<?xml version="1.0" encoding="UTF-8"?> 
<people> 
    <person> 
     <name>Bob</name> 
     <address> 
      <street>123 Fake St</address> 
      <city>Springfield</city> 
      <state>IL</state> 
      <zip>00000</zip> 
     </address> 
    </person> 
</people> 

我知道我可以只解析所有输入XML数据的,做我的计算,然后创建一个新的输出xml,但有没有更好的方式去做这件事?或许像使用xslt一样?

如果是这样,你能提供一些关于如何做到这一点的指导吗?

+0

对于xslt,请参阅http://stackoverflow.com/questions/10645359/convert-xml-attributes-to-elements-xslt – 2013-04-24 21:32:07

回答

1

这里是你将如何使用XSLT做到这一点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:custom="custom-functions"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/person"> 
    <people> 
     <xsl:copy> 
     <name> 
      <xsl:value-of select="@name"/> 
     </name> 
     <address> 
      <street> 
      <xsl:value-of select="@addr_street"/> 
      </street> 
      <city> 
      <xsl:value-of select="@addr_city"/> 
      </city> 
      <state> 
      <xsl:value-of select="@addr_state"/> 
      </state> 
      <zip> 
      <xsl:value-of 
       select="custom:figureOutZipCode(@addr_city, @addr_state)"/> 
      </zip> 
     </address> 
     </xsl:copy> 
    </people> 
    </xsl:template> 
</xsl:stylesheet> 

在.NET中,调用figureOutZipCode()函数通常会涉及到传递一个将XSLT扩展对象添加到XSLT处理器,该文档记录在here中。

0

使用LINQ转换XML到新的格式

string URL = @"location"; 
XDocument doc = XDocument.Load(URL); 

XElement newDoc = new XElement("people", 
      from p in doc.Descendants("person") 
      select new XElement("person", 
       new XElement("name", p.Attribute("name").Value), 
       new XElement("address", 
        new XElement("street", p.Attribute("addr_street").Value), 
        new XElement("city", p.Attribute("addr_city").Value), 
        new XElement("state", p.Attribute("addr_state").Value), 
        new XElement("zip", GetZip(parameters)) 
        ) 
      ) 
      ); 
+2

来自问题:“我知道我只能解析来自输入xml的所有数据,做我的计算,然后创建一个新的输出xml,但有没有更好的方法去做这件事?或许像是使用xslt?' – I4V 2013-04-24 22:08:13

1

其实,还可以使用XSLT转换的原始XML输出新的(转换)XML使用相同的XSLT表文件,如果使用result-document说明。这就要求撒克逊.NET XSLT解析器,请访问:http://saxon.sourceforge.net/

信息使用result-document这里:http://saxonica.com/documentation9.4-demo/html/xsl-elements/result-document.html

对于学习XSLT,我由迈克尔·凯(谁创造撒克逊)推荐任何东西,例如:http://www.amazon.com/XSLT-Programmers-Reference-Michael-Kay/dp/1861003129

+0

另请参见MSDN中的XslCompiledTransform类(包括示例):http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform(v=vs。 100)的.aspx – udog 2013-04-24 23:30:20

相关问题