C# 在c中,如何将同一根下的xml文件的元素组合在一起?
我有一个Xml文件,我想在其中解析properties元素下的“title”、“id”和“description”,并想写入CSV文件C# 在c中,如何将同一根下的xml文件的元素组合在一起?,c#,xml,csv,C#,Xml,Csv,我有一个Xml文件,我想在其中解析properties元素下的“title”、“id”和“description”,并想写入CSV文件 <?xml version="1.0" encoding="utf-8" standalone="yes"?> <feed xml:base="http://google.com/en-US/syndicate/" xmlns:d="http://schemas.google.com/ado/2007/08/dataservices" xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://google.com/en-US/syndicate/" xmlns:d="http://schemas.google.com/ado/2007/08/dataservices" xmlns:m="http://schemas.giooglt.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">Partners</title>
<id>http://googlre.com/en-US/syndicate/Partners</id>
<updated>2014-01-16T21:33:20Z</updated>
<link rel="self" title="Partners" href="Partners" />
<entry>
<id>http://pinpoint.microsoft.com/en-US/syndicate/Partners('4555')</id>
<title type="text">M55p; Co</title>
<summary type="text">
cccc is a Certified Partner, reseller, and implementer of
Key industries we work with include:
• Financial services
• Professional services
• Media / publishing
By focusing on mid-market to enterprise clients,
</summary>
<published>2009-07-21T14:23:50-07:00</published>
<updated>2013-11-22T15:00:46-08:00</updated>
<author>
<name>google chrome</name>
<uri>http://google.com/</uri>
<email>retee@gmail.com</email>
</author>
<link rel="edit" title="Partner" href="Partners('4255')" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Links" type="application/atom+xml;type=feed" title="Links" href="Partners('4559')/Links">
<m:inline>
<feed>
<title type="text">Links</title>
<id>http://google.com/('429')/Links</id>
<updated>2014-01-16T21:33:20Z</updated>
<link rel="self" title="Links" href="Partners('4ff')/Links" />
<entry>
<id>http://ryryr.com/en-US/syndicate/Links('ufufr')</id>
<title type="text">
</title>
<updated>2014-01-16T21:33:20Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Link" href="Links('partnerpage')" />
<category term="google.Commerce.ferrr.Syndicate.V2010_05.Link" sch="" eme="http://schemas.frrr.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Type>pgooglrpartnerpage</d:Type>
<d:Description>google Partner Page</d:Description>
<d:Url>http://googlgt.com/en-US/PartnerDetails.aspx?PartnerId=42555&wt.mc_id=66ttet</d:Url>
</m:properties>
</content>
</entry>
<entry>
<id>http://googlet.com/en-US/syndicate/Links('tpartnerrfipage')</id>
<title type="text">
</title>
<updated>2014-01-19T04:01:49Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Link" href="Links('pinpointpartnerrfipage')" />
<category term="google.Commerce.Marketplace.Syndicate.V2010_05.Link" scheme="http://schemas.google.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Type>tpartnerrfipage</d:Type>
<d:Description>RFI Page</d:Description>
<d:Url>http://pinpoint.microsoft.com/en-US/RFI.aspx?partnerId=4295719419&wt.mc_id=54545</d:Url>
</m:properties>
</content>
</entry>
</feed>
</m:inline>
</link>
</entry>
<entry>
<id>http://pinpoint.microsoft.com/en-US/syndicate/Partners('45')</id>
<title type="text">vfere</title>
<summary type="text">
cccc is a Certified Partner, reseller, and implementer of
Key industries we work with include:
• Financial services
• Professional services
• Media / publishing
By focusing on mid-market to enterprise clients,
</summary>
<published>2009-07-21T14:23:50-07:00</published>
<updated>2013-11-22T15:00:46-08:00</updated>
<author>
<name>google chrome</name>
<uri>http://google.com/</uri>
<email>retee@gmail.com</email>
</author>
<link rel="edit" title="Partner" href="Partners('4255')" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Links" type="application/atom+xml;type=feed" title="Links" href="Partners('4559')/Links" >
<m:inline>
<feed>
<title type="text">Links</title>
<id>http://google.com/('429')/Links</id>
<updated>2014-01-16T21:33:20Z</updated>
<link rel="self" title="Links" href="Partners('4ff')/Links" />
<entry>
<id>http://ryryr.com/en-US/syndicate/Links('ufufr')</id>
<title type="text">
</title>
<updated>2014-01-16T21:33:20Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Link" href="Links('partnerpage')" />
<category term="google.Commerce.ferrr.Syndicate.V2010_05.Link" scheme="http://schemas.frrr.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Type>pgooglrpartnerpage</d:Type>
<d:Description>google Partner Page</d:Description>
<d:Url>http://googlgt.com/en-US/PartnerDetails.aspx?PartnerId=42555&wt.mc_id=66ttet</d:Url>
</m:properties>
</content>
</entry>
<entry>
<id>http://googlet.com/en-US/syndicate/Links('tpartnerrfipage')</id>
<title type="text">
</title>
<updated>2014-01-19T04:01:49Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Link" href="Links('pinpointpartnerrfipage')" />
<category term="google.Commerce.Marketplace.Syndicate.V2010_05.Link" scheme="http://schemas.google.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Type>tpartnerrfipage</d:Type>
<d:Description>RFI Page</d:Description>
<d:Url>http://pinpoint.microsoft.com/en-US/RFI.aspx?partnerId=4295719419&wt.m</d:Url>
</m:properties>
</content>
</entry>
</feed>
</m:inline>
</link>
</entry>
</feed>
到目前为止,我的代码是
// Alternate Method for getting the Fields from the XML file
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("C:/Users/Administrator/Downloads/direct.xml");
XmlNamespaceManager xmlnm = new XmlNamespaceManager(xmlDocument.NameTable);
xmlnm.AddNamespace("de","http://www.w3.org/2005/Atom");
xmlnm.AddNamespace("m", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata");
xmlnm.AddNamespace("d", "http://schemas.microsoft.com/ado/2007/08/dataservices");
ParseXML(xmlDocument, xmlnm);
Debug.WriteLine("\n---XML parsed---");
string xmlFileName = "C:/Users/Administrator/Downloads/direct.xml";
XDocument customers = XDocument.Load(xmlFileName);
var queryResult = from c in customers.Descendants("entry").Attributes() select c.Name;
foreach (var item in queryResult)
{
Debug.WriteLine(item);
}
}
public static void ParseXML(XmlDocument xmlFile, XmlNamespaceManager xmlnm)
{
List<string> id = new List<string>();
List<string> title = new List<String>();
List<String> city = new List<String>();
String path = "C:/Users/Administrator/Downloads/data.csv";
var w = new StreamWriter(path);
//XmlNodeList nodes = xmlFile.SelectNodes("//ns:entry/ns:updated| //ns:entry/ns:published | //ns:entry/ns:id ", xmlnm);
XmlNodeList nodes = xmlFile.SelectNodes("//de:entry/de:title | //de:entry/de:link/m:inline/de:feed/de:id | //de:entry/de:link/m:inline/de:feed/de:entry/de:content/m:properties/d:Url | //de:entry/de:link/m:inline/de:feed/de:entry/de:content/m:properties/d:City | //de:entry/de:link/m:inline/de:feed/de:entry/de:content/m:properties/d:State | //de:entry/de:link/m:inline/de:feed/de:entry/de:content/m:properties/d:Country ", xmlnm);
XmlNodeList nodes1 = xmlFile.SelectNodes("//de:entry", xmlnm);
var line1 = string.Format("Field" + "," + "Data");
w.WriteLine(line1);
w.Flush();
Debug.WriteLine(nodes1.Count);
foreach (XmlNode node in nodes)
{
Debug.WriteLine(node.Name + " = " + node.InnerXml);
var line = string.Format(node.Name + "," + node.InnerText);
w.WriteLine(line);
w.Flush();
}
foreach (XmlNode node in nodes1)
{
string titl = node["title"].InnerText;
string ide = node["id"].InnerText;
Debug.WriteLine("Data :" + titl + "ID :" + ide);
}
}
我可以将“title”和“id”组合在一起,但无法按照示例中的指定一次读取“properties”下的“id”。新手程序员,c语言新手。任何帮助都将不胜感激 下面是一些使用XDocument而不是XmlDocument的代码,它根据您的要求返回强类型结果:
using (var reader = new StreamReader(@"C:/Users/Administrator/Downloads/direct.xml"))
{
var xmlDoc = XDocument.Load(reader);
XNamespace atom = "http://www.w3.org/2005/Atom";
XNamespace metadata = "http://schemas.giooglt.com/ado/2007/08/dataservices/metadata";
XNamespace dataservices = "http://schemas.google.com/ado/2007/08/dataservices";
var result = xmlDoc.Root.Elements(atom + "entry")
.Select(e => new {
Title = e.Element(atom + "title").Value,
Id = e.Element(atom + "id").Value,
Urls = e.Elements(atom + "link")
.Where(l => l.Element(metadata + "inline") != null)
.SelectMany(l => l.Element(metadata + "inline")
.Element(atom + "feed")
.Elements(atom + "entry")
.Select(e1 => e1.Element(atom + "content")
.Element(metadata + "properties")
.Element(dataservices + "Url").Value))
});
foreach (var entry in result)
{
foreach (var url in entry.Urls)
{
Console.WriteLine("{0},{1},{2}", entry.Title, entry.Id, url);
}
}
}
下面是它返回的匿名类的结构:
class Result
{
public string Title { get; set; }
public string Id { get; set; }
public IEnumerable<string> Urls { get; set; }
}
我不太确定您需要的输出CSV格式,但我想您应该能够根据这个结果自己创建它
编辑:为了您的方便,我在控制台中添加了一个简单的转储文件,它类似于问题的示例输出。您发布的示例XML的可能副本无效。我试图根据剩下的文本来修复它。请确保,我做得正确。@Marcin:是的,我也在早些时候发布过,但没有回复,所以这次我修改并输入了确切的要求。有什么想法吗?@Damir:谢谢你的编辑。有什么想法吗?我几乎拥有所有在线可用的资源,但未能部分按照要求解析数据。太好了,我非常感谢你。我大部分时间都被卡住了。我确实查看了XDocument,但我不太确定结果。再次感谢您的帮助。如何获取要显示的URL值?结果对我很有用。如何使用匿名类显示结果如何获取Url的值?我想不出获得价值的方法。
class Result
{
public string Title { get; set; }
public string Id { get; set; }
public IEnumerable<string> Urls { get; set; }
}
Title = "M55p; Co"
Id = "http://pinpoint.microsoft.com/en-US/syndicate/Partners('4555')"
Urls =
{
"http://googlgt.com/en-US/PartnerDetails.aspx?PartnerId=42555&wt.mc_id=66ttet"
"http://pinpoint.microsoft.com/en-US/RFI.aspx?partnerId=4295719419&wt.mc_id=54545"
}
Title = "vfere"
Id = "http://pinpoint.microsoft.com/en-US/syndicate/Partners('45')"
Urls =
{
"http://googlgt.com/en-US/PartnerDetails.aspx?PartnerId=42555&wt.mc_id=66ttet"
"http://pinpoint.microsoft.com/en-US/RFI.aspx?partnerId=4295719419&wt.m "
}