重构XML文件
我有一个客户,他希望在他的登记表中添加下拉列表,按国家代码列出世界上所有省份。为此,他给了我。不幸的是,数据的结构无法满足我的需要。下面是我想要的结构。是否有某种方法可以自动重新构造数据,可以使用XSLT或类似的方法?谢谢重构XML文件,xml,structure,Xml,Structure,我有一个客户,他希望在他的登记表中添加下拉列表,按国家代码列出世界上所有省份。为此,他给了我。不幸的是,数据的结构无法满足我的需要。下面是我想要的结构。是否有某种方法可以自动重新构造数据,可以使用XSLT或类似的方法?谢谢 <countries> <country code="US"> <region>Alaska</region> <region>California</region> </c
<countries>
<country code="US">
<region>Alaska</region>
<region>California</region>
</country>
</countries>
阿拉斯加州
加利福尼亚
如果必须转换该文件,我只需编写一个快速助手控制台应用程序,将当前文件反序列化为与当前格式对应的对象,然后运行一个循环,将数据放入与上述新格式对应的新对象继承机制中,然后将其序列化回XML
这样,如果我必须再次导入相同的文件,我可以重新运行我的转换应用程序。如果我必须转换该文件,我只需编写一个快速助手控制台应用程序,将当前文件反序列化为与当前格式对应的对象,然后只需运行一个循环,将数据放入与上述新格式对应的新对象继承机制中,然后将其序列化回XML
这样,如果我必须再次导入相同的文件,我可以重新运行我的转换应用程序。也许这可以帮助你
也许这对你有帮助
您可以使用喜爱的正则表达式工具来转换文件。例如,在.NET中,您可以使用:
string result = Regex.Replace(Regex.Replace(input, "<(..)>", "<country code=\"$1\">"), "</..>", "</country>");
string result=Regex.Replace(Regex.Replace(输入,“,”),“,”);
$1表示第一个匹配组“(..”匹配的字符串
这是你的
有关详细信息,请参阅网站regular-expressions.info。您可以使用喜爱的正则表达式工具转换文件。例如,在.NET中,您可以使用:
string result = Regex.Replace(Regex.Replace(input, "<(..)>", "<country code=\"$1\">"), "</..>", "</country>");
string result=Regex.Replace(Regex.Replace(输入,“,”),“,”);
$1表示第一个匹配组“(..”匹配的字符串
这是你的
有关详细信息,请参阅网站regular-expressions.info。我的XSLT fu无法胜任,但可以使用XSLT 实际上,您只想做一件聪明的事情,那就是将国家代码标记转换为标记 迭代特定节点的子节点列表非常简单,您可以获得当前节点的标记名,并且可以或多或少地输出您想要的任何内容。。。我不确定(这不是我必须做的任何事情)的地方是提取节点名称的确切咒语 编辑:一个太好的问题,不能放弃(学习机会) 当然,答案中缺少的一点是“开” 这就给了你这个(根据我所知道的……我确信区域的副本可以简化,但我不知道如何简化!):
欢迎提出改进建议-将酌情修改 我的XSLT fu无法胜任,但是是的,您可以使用XSLT来完成 实际上,您只想做一件聪明的事情,那就是将国家代码标记转换为标记 迭代特定节点的子节点列表非常简单,您可以获得当前节点的标记名,并且可以或多或少地输出您想要的任何内容。。。我不确定(这不是我必须做的任何事情)的地方是提取节点名称的确切咒语 编辑:一个太好的问题,不能放弃(学习机会) 当然,答案中缺少的一点是“开” 这就给了你这个(根据我所知道的……我确信区域的副本可以简化,但我不知道如何简化!):
欢迎提出改进建议-将酌情修改 这可以通过向XSLT标识转换添加单个模板轻松实现:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="countries/*">
<country code="{name()}">
<xsl:apply-templates select="region"/>
</country>
</xsl:template>
</xsl:stylesheet>
这可以通过向XSLT标识转换添加单个模板轻松实现:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="countries/*">
<country code="{name()}">
<xsl:apply-templates select="region"/>
</country>
</xsl:template>
</xsl:stylesheet>
我应该先检查这里的答案(没有收到电子邮件通知),但我设法编写了一个小型ASP/VB程序来实现这一点。谢谢你们的回答!如果我先在这里检查的话,我会节省一些时间。至少我现在有一个可以重用的程序。我应该先检查这里的答案(没有收到电子邮件通知),但我设法编写了一个小型ASP/VB程序来实现这一点。谢谢你们的回答!如果我先在这里检查的话,我会节省一些时间。至少我现在有一个可以重用的程序。谢谢Murph和Robert!我将键入这段代码,以备将来需要。谢谢Murph和Robert!我将键入此代码段,以备将来需要。