我有一个这种格式的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 :(得分:1)
实际上,如果使用result-document
指令,使用XSLT可以转换原始XML并使用相同的XSLT表输出新的(转换的)XML文件。这需要Saxon .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
答案 1 :(得分: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。
答案 2 :(得分: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))
)
)
);