如何转换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 ?
如果是这样,你能给我一些指导如何做吗?
下面是使用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))
)
)
);