我在字符串中有一个格式如下的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或任何其他进程)
请帮忙......
答案 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生成所需的文件结构。
祝你好运!