英文:
C# Linq parent and child element
问题
I understand your request. Here is the translated code portion for building a string with seat, game_id, block>id, and customer>id:
var seats = daneXML.Elements("block")
.Elements("seat")
.Select(seat =>
seat.Element("id").Value + "," +
seat.Element("intid").Value + "," +
seat.Element("abo").Value + "," +
seat.Element("customer").Element("customerid").Value + "," +
game_id + "," +
seat.Parent.Element("id").Value);
foreach (var seat in seats)
{
Console.WriteLine(seat);
}
This code retrieves the necessary elements from the XML and constructs a string with seat, game_id, block>id, and customer>id as you requested.
英文:
Im trying to build a string for mysql insert from XML data, in one case I need to build string with coresponding child and parent elements.
XML
<data>
<game>
<id>173</id>
<stadium>173</stadium>
<date>20230408181th</date>
<title>123</title>
</game>
<block>
<id>1</id>
<entry>4</entry>
<title>0</title>
<visible>1</visible>
<numbered>1</numbered>
<seat>
<id>1</id>
<intid>123456</intid>
<abo>N</abo>
<customer>
<customerid>10295</customerid>
</customer>
</seat>
<seat>
<id>1</id>
<intid>1234567</intid>
<abo>N</abo>
<customer>
<customerid>10295</customerid>
</customer>
</seat>
</block>
<block>
<id>2</id>
<entry>3</entry>
<title>0</title>
<visible>1</visible>
<numbered>1</numbered>
<seat>
<id>1</id>
<intid>12345678</intid>
<abo>N</abo>
<customer>
<customerid>102951</customerid>
</customer>
</seat>
<seat>
<id>1</id>
<intid>123456790</intid>
<abo>N</abo>
<customer>
<customerid>102951</customerid>
</customer>
</seat>
</block>
My code:
AllocConsole();
var daneXML = XElement.Load("file.xml");
string game_id = daneXML.Elements("game").Elements("id").First().Value;
textbox.Text = game_id;
var games = daneXML.Elements("game").Select(game => game.Element("id").Value + "," + game.Element("stadium").Value +","+ game.Element("date").Value + ","+game.Element("title").Value);
foreach (var game in games)
{
Console.WriteLine(game);
}
var blocks = daneXML.Elements("block").Select(block => block.Element("id").Value + "," + block.Element("entry").Value + "," + block.Element("visible").Value + "," + block.Element("numbered").Value);
foreach (var block in blocks)
{
Console.WriteLine(block + "," + game_id);
}
var customers = daneXML.Elements("block").Elements("seat").Elements("customer").Select(customer => customer.Element("customerid").Value + "," + customer.Element("name").Value + "," + customer.Element("vorname").Value);
foreach (var customer in customers)
{
Console.WriteLine(customer);
//insert ignore
}
var seats = daneXML.Elements("block").Elements("seat").Select(seat => seat.Element("id").Value + "," + seat.Element("intid").Value + "," + seat.Element("abo").Value + "," + seat.Element("customerid").Value);
foreach (var seat in seats)
{
Console.WriteLine(seat+","+game_id);
}
As game_id is constant its simple to get it but for seat I need also parent block>id and child customer>customerid.
How to build string with seat,game_id,block>id,customer>id?
答案1
得分: -1
Xml 是一项相当古老的技术。我建议使用 Newtonsoft.Json 和 LINQ
使用 Newtonsoft.Json;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
var data = JObject.Parse(JsonConvert.SerializeXmlNode(xmlDoc,
Newtonsoft.Json.Formatting.None, true));
List<string> seats = new();
var gameId = data["game"]["id"].ToString();
foreach (var item in data["block"].ToArray())
{
foreach (var seat in item["seat"])
{
seat["customer"] = seat["customer"]["customerid"];
seats.Add(gameId + "," + item["id"].ToString() + ","
+ string.Join(",", ((JObject)seat).Properties()
.Select(y => y.Value.ToString())));
}
}
测试
foreach (var s in seats) Console.WriteLine(s);
173,1,1,123456,N,10295
173,1,1,1234567,N,10295
173,2,1,12345678,N,102951
173,2,1,123456790,N,102951
英文:
Xml is a quite ancient technology. I recommend to use Newtonsoft.Json and LINQ
using Newtonsoft.Json;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
var data = JObject.Parse(JsonConvert.SerializeXmlNode(xmlDoc,
Newtonsoft.Json.Formatting.None, true));
List<string> seats = new();
var gameId = data["game"]["id"].ToString();
foreach (var item in data["block"].ToArray())
{
foreach (var seat in item["seat"])
{
seat["customer"] = seat["customer"]["customerid"];
seats.Add(gameId + "," + item["id"].ToString() + ","
+ string.Join(",", ((JObject)seat).Properties()
.Select(y => y.Value.ToString())));
}
}
test
foreach (var s in seats) Console.WriteLine(s);
173,1,1,123456,N,10295
173,1,1,1234567,N,10295
173,2,1,12345678,N,102951
173,2,1,123456790,N,102951
答案2
得分: -1
这种方法也可以。
var data = XElement.Load("file.xml");
var output = new List<string>();
foreach (var block in data.Elements("block"))
{
var blockId = block.Element("id").Value;
foreach (var seat in block.Elements("seat"))
{
var seatId = seat.Element("id").Value;
var intId = seat.Element("intid").Value;
var abo = seat.Element("abo").Value;
var customerId = seat.Element("customer").Element("customerid").Value;
output.Add($"{seatId},{game_id},{blockId},{customerId}");
}
}
var result = string.Join(Environment.NewLine, output);
英文:
This approach will work also.
var data = XElement.Load("file.xml");
var output = new List<string>();
foreach (var block in data.Elements("block"))
{
var blockId = block.Element("id").Value;
foreach (var seat in block.Elements("seat"))
{
var seatId = seat.Element("id").Value;
var intId = seat.Element("intid").Value;
var abo = seat.Element("abo").Value;
var customerId = seat.Element("customer").Element("customerid").Value;
output.Add($"{seatId},{game_id},{blockId},{customerId}");
}
}
var result = string.Join(Environment.NewLine, output);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论