C# XML解析和转换(XSLT或其他)
我有几个xml文件的格式如下:C# XML解析和转换(XSLT或其他),c#,xml,xslt,xpath,xml-parsing,C#,Xml,Xslt,Xpath,Xml Parsing,我有几个xml文件的格式如下: <ROOT> <OBJECT> <identity> <id>123</id> </identity> <child2 attr = "aa">32</child2> <child3> <childOfChild3 att1="aaa" att2="bbb" att3="CC
<ROOT>
<OBJECT>
<identity>
<id>123</id>
</identity>
<child2 attr = "aa">32</child2>
<child3>
<childOfChild3 att1="aaa" att2="bbb" att3="CCC">LN</childOfChild3>
</child3>
<child4>
<child5>
<child6>3ddf</child6>
<child7>
<childOfChild7 att31="RR">1231</childOfChild7>
</child7>
</child5>
</child4>
</OBJECT>
<OBJECT>
<identity>
<id>124</id>
</identity>
<child2 attr = "bb">212</child2>
<child3>
<childOfChild3 att1="ee" att2="ccc" att3="EREA">OP</childOfChild3>
</child3>
<child4>
<child5>
<child6>213r</child6>
<child7>
<childOfChild7 att31="EE">1233</childOfChild7>
</child7>
</child5>
</child4>
</OBJECT>
</ROOT>
123
32
液态氮
3ddf
1231
124
212
操作
213r
1233
我如何以这种方式格式化它
<ROOT>
<OBJECT>
<id>123</id>
<child2>32</child2>
<attr>aa</attr>
<child3></child3>
<childOfChild3>LN</childOfChild3>
<att1>aaa</att1>
<att2>bbb</att2>
<att3>CCC</att3>
<child4></child4>
<child5></child5>
<child6>3ddf</child6>
<child7></child7>
<childOfChild7>1231</childOfChild7>
<att31>RR</att31>
</OBJECT>
<OBJECT>
<id>124</id>
<child2>212</child2>
<attr>bb</attr>
<child3></child3>
<childOfChild3>LN</childOfChild3>
<att1>ee</att1>
<att2>ccc</att2>
<att3>EREA</att3>
<child4></child4>
<child5></child5>
<child6>213r</child6>
<child7></child7>
<childOfChild7>1233</childOfChild7>
<att31>EE</att31>
</OBJECT>
</ROOT>
123
32
aa
液态氮
aaa
bbb
CCC
3ddf
1231
RR
124
212
bb
液态氮
ee
ccc
埃里亚
213r
1233
EE
我知道一些C#所以可能有一个解析器?还是一些通用的xslt?
xml文件是从客户端接收的一些数据,因此我无法控制它们发送给我的方式
L.E.基本上,当我试图在excel中测试这些数据时(例如,我想确保childOfChild7的属性对应于正确的标识id),我得到了大量的空格。如果我在access中导入只获取我想要的数据,那么我必须执行数千个子查询才能将它们全部放入一个漂亮的表中。基本上,我只想看到一个对象的所有数据(一个对象-一行),然后删除/隐藏我不需要的列。我对C不熟悉,但我希望这至少能让你开始。我必须做类似的事情,在那里我会得到一个XML文件并将信息解析到数据库中
我使用了一个javalib~。它将允许您使用父子系统非常轻松地读取XML文件并将信息解析为另一个XML文件。我希望这能帮上一点忙。你可以把它展平。将对象的所有子体转换为元素。您应该亲自尝试,而不仅仅是接受我的代码,但它是有效的,这样您就可以根据自己的想法进行测试
XElement root1 = XElement.Load(file1);
XElement root = new XElement("ROOT",
root1.Elements()
.Select(o => new XElement(o.Name, o
.Descendants()
.Select(x =>
{
List<XElement> list = new List<XElement>();
list.Add(new XElement(x.Name, x.HasElements ? "" : x.Value));
if (x.HasAttributes)
list.AddRange(x.Attributes()
.Select(a => new XElement(a.Name, a.Value))
);
return list;
})
))
.ToArray());
XElement root1=XElement.Load(file1);
XElement根=新的XElement(“根”,
root1.Elements()
.选择(o=>new-XElement(o.Name,o
.后代()
.选择(x=>
{
列表=新列表();
添加(新元素(x.Name,x.HasElements?“:x.Value));
if(x.HasAttributes)
list.AddRange(x.Attributes()
.Select(a=>newxelement(a.Name,a.Value))
);
退货清单;
})
))
.ToArray());
注:您忘记了结果集中的
。只需使用XmlSerializer将其反序列化为一个类,下面是一个示例,基本上您构建了一个与xml结构匹配的类,然后让XmlSerializer类进行转换,您不需要创建自己的解析器,这里是一个纯XSLT 1.0解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="OBJECT//*[not(self::identity) and text()]">
<xsl:copy>
<xsl:apply-templates select="text()"/>
</xsl:copy>
<xsl:apply-templates select="@* | node()[not(self::text())]"/>
</xsl:template>
<xsl:template match="OBJECT//*[not(self::identity) and (not(text()))]">
<xsl:copy/>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="identity">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<ROOT>
<OBJECT>
<identity>
<id>123</id>
</identity>
<child2 attr = "aa">32</child2>
<child3>
<childOfChild3 att1="aaa" att2="bbb" att3="CCC">LN</childOfChild3>
</child3>
<child4>
<child5>
<child6>3ddf</child6>
<child7>
<childOfChild7 att31="RR">1231</childOfChild7>
</child7>
</child5>
</child4>
</OBJECT>
<OBJECT>
<identity>
<id>124</id>
</identity>
<child2 attr = "bb">212</child2>
<child3>
<childOfChild3 att1="ee" att2="ccc" att3="EREA">OP</childOfChild3>
</child3>
<child4>
<child5>
<child6>213r</child6>
<child7>
<childOfChild7 att31="EE">1233</childOfChild7>
</child7>
</child5>
</child4>
</OBJECT>
</ROOT>
<ROOT>
<OBJECT>
<id>123</id>
<child2>32</child2>
<attr>aa</attr>
<child3/>
<childOfChild3>LN</childOfChild3>
<att1>aaa</att1>
<att2>bbb</att2>
<att3>CCC</att3>
<child4/>
<child5/>
<child6>3ddf</child6>
<child7/>
<childOfChild7>1231</childOfChild7>
<att31>RR</att31>
</OBJECT>
<OBJECT>
<id>124</id>
<child2>212</child2>
<attr>bb</attr>
<child3/>
<childOfChild3>OP</childOfChild3>
<att1>ee</att1>
<att2>ccc</att2>
<att3>EREA</att3>
<child4/>
<child5/>
<child6>213r</child6>
<child7/>
<childOfChild7>1233</childOfChild7>
<att31>EE</att31>
</OBJECT>
</ROOT>
123
32
液态氮
3ddf
1231
124
212
操作
213r
1233
生成所需的正确结果:
<ROOT>
<OBJECT>
<identity>
<id>123</id>
</identity>
<child2 attr = "aa">32</child2>
<child3>
<childOfChild3 att1="aaa" att2="bbb" att3="CCC">LN</childOfChild3>
</child3>
<child4>
<child5>
<child6>3ddf</child6>
<child7>
<childOfChild7 att31="RR">1231</childOfChild7>
</child7>
</child5>
</child4>
</OBJECT>
<OBJECT>
<identity>
<id>124</id>
</identity>
<child2 attr = "bb">212</child2>
<child3>
<childOfChild3 att1="ee" att2="ccc" att3="EREA">OP</childOfChild3>
</child3>
<child4>
<child5>
<child6>213r</child6>
<child7>
<childOfChild7 att31="EE">1233</childOfChild7>
</child7>
</child5>
</child4>
</OBJECT>
</ROOT>
<ROOT>
<OBJECT>
<id>123</id>
<child2>32</child2>
<attr>aa</attr>
<child3/>
<childOfChild3>LN</childOfChild3>
<att1>aaa</att1>
<att2>bbb</att2>
<att3>CCC</att3>
<child4/>
<child5/>
<child6>3ddf</child6>
<child7/>
<childOfChild7>1231</childOfChild7>
<att31>RR</att31>
</OBJECT>
<OBJECT>
<id>124</id>
<child2>212</child2>
<attr>bb</attr>
<child3/>
<childOfChild3>OP</childOfChild3>
<att1>ee</att1>
<att2>ccc</att2>
<att3>EREA</att3>
<child4/>
<child5/>
<child6>213r</child6>
<child7/>
<childOfChild7>1233</childOfChild7>
<att31>EE</att31>
</OBJECT>
</ROOT>
123
32
aa
液态氮
aaa
bbb
CCC
3ddf
1231
RR
124
212
bb
操作
ee
ccc
埃里亚
213r
1233
EE
为什么要重新格式化原始xml?您的新格式看起来非常非规范化……除了示例输出外,您能否用文字描述所需的转换,以便我们在推断转换规则时减少工作量(和错误)?