如何解析此文本并构建对象
How to parse the this text and build an object
我正在从第三方应用程序获取数据,如下所示:
Customer Name = Cust1.xml
<NAME>/Mark</NAME>
<TYPE>Type 1</TYPE>
<ADDRESS>Some Address</ADDRESS>
<CITY>Some City</VIRTHOSTNM>
<ZIP>11111</ZIP>
Junction Name = Cust2.xml
<NAME>/Robert</NAME>
<TYPE>Type 2</TYPE>
<ADDRESS>Address 1</ADDRESS>
<ADDRESS>Address 2</ADDRESS>
<CITY>City For Address 1</CITY>
<CITY>City For Address 2</CITY>
<ZIP>Zip For City 1/ZIP>
<ZIP>ZIP For City 2</ZIP>
可以有multiple nodes
和Address, City and Zip
。 First City and ZIP Nodes belong to the first Address and second to the second one
等等。
这是我目前所做的:
string filePath = @"C:\SomeData.txt";
var data = File.ReadAllText(filePath);
string[] customers = data.Split(new[] { "Customer Name = " }, StringSplitOptions.RemoveEmptyEntries);
这给了我 2 个字符串的数组。
但我很难尝试循环并弄清楚如何以正确的顺序关联地址城市和邮政编码以获取 Cust2
.
等数据
如果我对你的问题的理解正确的话,你可以试试这样的方法。请注意,我添加了一个根节点。即使你的文档在读入时没有这个,你也可以追加到前面和末尾然后这样做:
private void ParseXML()
{
string xml = "<root><NAME>Robert</NAME> <TYPE>Type 2</TYPE><ADDRESS>Address 1</ADDRESS><ADDRESS>Address 2</ADDRESS><CITY>City For Address 1</CITY><CITY>City For Address 2</CITY><ZIP>Zip For City 1</ZIP><ZIP>ZIP For City 2</ZIP></root>";
var xDoc = XDocument.Parse(xml);
int count = xDoc.Descendants("ADDRESS").Count();
var addressDict = new Dictionary<XElement, Dictionary<XElement, XElement>>();
int skipIndex = 0;
for (int takeIndex = 1; takeIndex <= count; takeIndex++)
{
var cityAndZIPDict = new Dictionary<XElement,XElement>();
cityAndZIPDict.Add(xDoc.Descendants("CITY").Skip(skipIndex).Take(takeIndex).First(),xDoc.Descendants("ZIP").Skip(skipIndex).Take(takeIndex).First() );
addressDict.Add(xDoc.Descendants("ADDRESS").Skip(skipIndex).Take(takeIndex).First(), cityAndZIPDict);
skipIndex++;
}
}
我正在从第三方应用程序获取数据,如下所示:
Customer Name = Cust1.xml
<NAME>/Mark</NAME>
<TYPE>Type 1</TYPE>
<ADDRESS>Some Address</ADDRESS>
<CITY>Some City</VIRTHOSTNM>
<ZIP>11111</ZIP>
Junction Name = Cust2.xml
<NAME>/Robert</NAME>
<TYPE>Type 2</TYPE>
<ADDRESS>Address 1</ADDRESS>
<ADDRESS>Address 2</ADDRESS>
<CITY>City For Address 1</CITY>
<CITY>City For Address 2</CITY>
<ZIP>Zip For City 1/ZIP>
<ZIP>ZIP For City 2</ZIP>
可以有multiple nodes
和Address, City and Zip
。 First City and ZIP Nodes belong to the first Address and second to the second one
等等。
这是我目前所做的:
string filePath = @"C:\SomeData.txt";
var data = File.ReadAllText(filePath);
string[] customers = data.Split(new[] { "Customer Name = " }, StringSplitOptions.RemoveEmptyEntries);
这给了我 2 个字符串的数组。
但我很难尝试循环并弄清楚如何以正确的顺序关联地址城市和邮政编码以获取 Cust2
.
如果我对你的问题的理解正确的话,你可以试试这样的方法。请注意,我添加了一个根节点。即使你的文档在读入时没有这个,你也可以追加到前面和末尾然后这样做:
private void ParseXML()
{
string xml = "<root><NAME>Robert</NAME> <TYPE>Type 2</TYPE><ADDRESS>Address 1</ADDRESS><ADDRESS>Address 2</ADDRESS><CITY>City For Address 1</CITY><CITY>City For Address 2</CITY><ZIP>Zip For City 1</ZIP><ZIP>ZIP For City 2</ZIP></root>";
var xDoc = XDocument.Parse(xml);
int count = xDoc.Descendants("ADDRESS").Count();
var addressDict = new Dictionary<XElement, Dictionary<XElement, XElement>>();
int skipIndex = 0;
for (int takeIndex = 1; takeIndex <= count; takeIndex++)
{
var cityAndZIPDict = new Dictionary<XElement,XElement>();
cityAndZIPDict.Add(xDoc.Descendants("CITY").Skip(skipIndex).Take(takeIndex).First(),xDoc.Descendants("ZIP").Skip(skipIndex).Take(takeIndex).First() );
addressDict.Add(xDoc.Descendants("ADDRESS").Skip(skipIndex).Take(takeIndex).First(), cityAndZIPDict);
skipIndex++;
}
}