2013-04-05 147 views
1

我有如下格式字符串中的XML:轉換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

這種短期和簡單的變換:

<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

+0

對不起,延遲迴復謝謝你的實施它效果不錯... – jats 2013-04-09 00:37:30

+0

@jats,不客氣。 – 2013-04-09 01:42:24

0

您應該使用:Linq to xml

首先,我會準備一組集合或更好的新類:組和項目。

在第二階段解析源文件,用數據填充集合。

最後,從這些類集合生成使用linq to xml所需的文件結構。

祝你好運!