0

我有一个这种格式的 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 之类的东西?

如果是这样,您能否就如何做到这一点提供一些指导?

4

3 回答 3

1

实际上,如果您使用 XSLTresult-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,我推荐 Michael Kay(创建 Saxon)的任何东西,例如:http ://www.amazon.com/XSLT-Programmers-Reference-Michael-Kay/dp/1861003129

于 2013-04-24T21:40:51.507 回答
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 处理器,这在此处进行了说明。

于 2013-04-25T01:46:33.237 回答
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))
                    )
            )
            );
于 2013-04-24T21:36:46.157 回答