转换XML格式

时间:2013-04-05 02:07:27

标签: xml xslt

我在字符串中有一个格式如下的XML:

  <?xml version="1.0" encoding="utf-8" ?> 
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <soap:Body>
- <GetUserLinksResponse xmlns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService">
- <GetUserLinksResult>
- <QuickLinkData>
  <Name>System 1</Name> 
  <Group>General</Group> 
  <Privacy>Private</Privacy> 
  <Url>https://url1.com</Url> 
  <ID>6500</ID> 
  </QuickLinkData>
- <QuickLinkData>
  <Name>System 2</Name> 
  <Group>General</Group> 
  <Privacy>Private</Privacy> 
  <Url>https://url2.com</Url> 
  <ID>6499</ID> 
  </QuickLinkData>
- <QuickLinkData>
  <Name>System 3</Name> 
  <Group>Work</Group> 
  <Privacy>Private</Privacy> 
  <Url>http://url3.com</Url> 
  <ID>6845</ID> 
  </QuickLinkData>
  </GetUserLinksResult>
  </GetUserLinksResponse>
  </soap:Body>
  </soap:Envelope>

我希望格式如下,使用xslt或c#:

<?xml version="1.0" encoding="utf-8" ?> 
<root>
<Group>
<Value>General</Value>
<Item>
 <ID>6500</ID>
 <Name>System 1</Name>
 <Url>https://url1.com</Url>
</Item>
<Item>
 <ID>6499</ID>
 <Name>System 2</Name>
 <Url>https://url2.com</Url>
</Item>
</Group>
<Group>
<Value>Work</Value>
<Item>
 <ID>6845</ID>
 <Name>System 3</Name>
 <Url>https://url3.com</Url>
</Item>
</Group>
</root>

可能有多个小组 我怎样才能在c#中实现这一点(使用xslt或任何其他进程)

请帮忙......

2 个答案:

答案 0 :(得分:2)

这个简短而简单的转型:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService"
 exclude-result-prefixes="x">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kGroupByVal" match="x:Group" use="."/>

 <xsl:template match=
   "x:Group[generate-id() = generate-id(key('kGroupByVal',.)[1])]">
  <Group>
   <Value><xsl:value-of select="."/></Value>
   <xsl:apply-templates select="key('kGroupByVal',.)/.." mode="inGroup"/>
  </Group>
 </xsl:template>

 <xsl:template match="x:QuickLinkData" mode="inGroup">
  <Item>
   <ID><xsl:value-of select="x:ID"/></ID>
   <Name><xsl:value-of select="x:Name"/></Name>
   <Url><xsl:value-of select="x:Url"/></Url>
  </Item>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的XML文档时:

<soap:Envelope
 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetUserLinksResponse
          xmlns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService">
            <GetUserLinksResult>
                <QuickLinkData>
                    <Name>System 1</Name>
                    <Group>General</Group>
                    <Privacy>Private</Privacy>
                    <Url>https://url1.com</Url>
                    <ID>6500</ID>
                </QuickLinkData>
                <QuickLinkData>
                    <Name>System 2</Name>
                    <Group>General</Group>
                    <Privacy>Private</Privacy>
                    <Url>https://url2.com</Url>
                    <ID>6499</ID>
                </QuickLinkData>
                <QuickLinkData>
                    <Name>System 3</Name>
                    <Group>Work</Group>
                    <Privacy>Private</Privacy>
                    <Url>http://url3.com</Url>
                    <ID>6845</ID>
                </QuickLinkData>
            </GetUserLinksResult>
        </GetUserLinksResponse>
    </soap:Body>
</soap:Envelope>

会产生想要的正确结果:

<Group>
   <Value>General</Value>
   <Item>
      <ID>6500</ID>
      <Name>System 1</Name>
      <Url>https://url1.com</Url>
   </Item>
   <Item>
      <ID>6499</ID>
      <Name>System 2</Name>
      <Url>https://url2.com</Url>
   </Item>
</Group>
<Group>
   <Value>Work</Value>
   <Item>
      <ID>6845</ID>
      <Name>System 3</Name>
      <Url>http://url3.com</Url>
   </Item>
</Group>

<强>解释

正确使用 Muenchian Grouping Method

答案 1 :(得分:0)

您应该使用:Linq to xml

首先,我会准备一组集合或更好的新类:Group和Item。

在第二阶段解析源文件,用数据填充集合。

最后,从这些类集合中使用linq到xml生成所需的文件结构。

祝你好运!