如何转换xml文档并插入额外的数据

本文关键字:插入 数据 文档 xml 何转换 转换 | 更新日期: 2023-09-27 18:10:42

我有一个这样格式的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 ?

如果是这样,你能给我一些指导如何做吗?

如何转换xml文档并插入额外的数据

下面是使用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处理器,这里有文档说明。

实际上,如果使用result-document指令,您可以使用相同的XSLT表转换原始XML并输出新的(转换后的)XML文件。这需要Saxon .NET XSLT解析器,可以在这里获得:http://saxon.sourceforge.net/

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

对于学习XSLT,我推荐Michael Kay (Saxon的创建者)的任何内容,例如:http://www.amazon.com/XSLT-Programmers-Reference-Michael-Kay/dp/1861003129

使用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))
                    )
            )
            );