使用C#Linq to XML创建XML输出后,XML输出包含重复的值
下面是我创建XML文件的代码使用C#Linq to XML创建XML输出后,XML输出包含重复的值,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,下面是我创建XML文件的代码 public void CreateXml(string[] names, string[] values, string type) { XElement xml = new XElement("Transaction", new XElement("TransactionType", type)); foreach (var i in names) { foreach
public void CreateXml(string[] names, string[] values, string type)
{
XElement xml = new XElement("Transaction",
new XElement("TransactionType", type));
foreach (var i in names)
{
foreach (var o in values)
{
xml.Add(new XElement(i.Replace(" ", string.Empty), o));
}
}
xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
我的输出是这样的
<?xml version="1.0" encoding="UTF-8"?>
<Transaction>
<TransactionType>Void</TransactionType>
<Zip>1</Zip>
<Zip>2</Zip>
<PNRef>1</PNRef>
<PNRef>2</PNRef>
</Transaction>
<?xml version="1.0" encoding="UTF-8"?>
<Transaction>
<TransactionType>Void</TransactionType>
<Zip>1</Zip>
<PNRef>2</PNRef>
</Transaction>
无效的
1.
2.
1.
2.
但这是不对的,我期待更多像这样的
<?xml version="1.0" encoding="UTF-8"?>
<Transaction>
<TransactionType>Void</TransactionType>
<Zip>1</Zip>
<Zip>2</Zip>
<PNRef>1</PNRef>
<PNRef>2</PNRef>
</Transaction>
<?xml version="1.0" encoding="UTF-8"?>
<Transaction>
<TransactionType>Void</TransactionType>
<Zip>1</Zip>
<PNRef>2</PNRef>
</Transaction>
无效的
1.
2.
正如我所注意到的,这些值是正确的,但如果我只是重复,我该如何解决这个问题
string[] textBoxNamesArray = flowLayoutPanelText.Controls.OfType<TextBox>()
.Select(r => r.Name)
.ToArray();
string[] textBoxTextsArray = flowLayoutPanelText.Controls.OfType<TextBox>()
.Select(r => r.Text)
.ToArray();
string[]textBoxNamesArray=flowLayoutPanelText.Controls.OfType()
.Select(r=>r.Name)
.ToArray();
string[]textBoxTextsArray=flowLayoutPanelText.Controls.OfType()的字符串
.选择(r=>r.Text)
.ToArray();
如果不知道如何在2个数组中构造数据,很难说,但我猜:
for (int i = 0; i < names.Length; i++)
{
xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
}
for(int i=0;i
如果不知道如何在2个数组中构造数据,很难说,但我猜:
for (int i = 0; i < names.Length; i++)
{
xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
}
for(int i=0;i
您不应该使用两个嵌套循环:两个嵌套循环创建笛卡尔乘积(即,每个名称都与每个值配对)
如果使用一个同时遍历名称和值的循环,您将获得预期的输出
如果您使用的是.NET 4,则可以使用Zip
方法,如下所示:
xml.Add(
names
.Zip(values, (n,v) => new XElement(n.Name(" ", string.Empty), v))
.ToArray()
);
因此,您不应该使用两个嵌套循环:两个嵌套循环创建笛卡尔乘积(即,每个名称都与每个值配对) 如果使用一个同时遍历名称和值的循环,您将获得预期的输出 如果您使用的是.NET 4,则可以使用
Zip
方法,如下所示:
xml.Add(
names
.Zip(values, (n,v) => new XElement(n.Name(" ", string.Empty), v))
.ToArray()
);
用字典试试这个
public void CreateXml(Dictionary<string, string> myNameValuePairs, string type)
{
XElement xml = new XElement("Transaction",
new XElement("TransactionType", type));
foreach (var key in names)
{
xml.Add(new XElement(key.Replace(" ", string.Empty), myNameValuePairs[key]));
}
xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
public void CreateXml(字典myNameValuePairs,字符串类型)
{
XElement xml=新XElement(“事务”,
新XElement(“TransactionType”,type));
foreach(变量输入名称)
{
Add(新的XElement(key.Replace(“,string.Empty),myNameValuePairs[key]);
}
Save(“C:\\Users\\PHWS13\\Desktop\\sample.xml”);
}
编辑:使用上述方法签名的变通方法。但是,只有当值[i]是名称[i]的对应值时,这才有效。除非您确定名称和值的数组长度和内容,否则我不会建议您这样做
public void CreateXml(string[] names, string[] values, string type)
{
XElement xml = new XElement("Transaction",
new XElement("TransactionType", type));
foreach (var i = 0; i < names.length; i++)
{
xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
}
xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
public void CreateXml(字符串[]名称、字符串[]值、字符串类型)
{
XElement xml=新XElement(“事务”,
新XElement(“TransactionType”,type));
foreach(var i=0;i
用字典试试这个
public void CreateXml(Dictionary<string, string> myNameValuePairs, string type)
{
XElement xml = new XElement("Transaction",
new XElement("TransactionType", type));
foreach (var key in names)
{
xml.Add(new XElement(key.Replace(" ", string.Empty), myNameValuePairs[key]));
}
xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
public void CreateXml(字典myNameValuePairs,字符串类型)
{
XElement xml=新XElement(“事务”,
新XElement(“TransactionType”,type));
foreach(变量输入名称)
{
Add(新的XElement(key.Replace(“,string.Empty),myNameValuePairs[key]);
}
Save(“C:\\Users\\PHWS13\\Desktop\\sample.xml”);
}
编辑:使用上述方法签名的变通方法。但是,只有当值[i]是名称[i]的对应值时,这才有效。除非您确定名称和值的数组长度和内容,否则我不会建议您这样做
public void CreateXml(string[] names, string[] values, string type)
{
XElement xml = new XElement("Transaction",
new XElement("TransactionType", type));
foreach (var i = 0; i < names.length; i++)
{
xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
}
xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
public void CreateXml(字符串[]名称、字符串[]值、字符串类型)
{
XElement xml=新XElement(“事务”,
新XElement(“TransactionType”,type));
foreach(var i=0;i
您的问题就在这里。foreach(名称中的vari){foreach(值中的varo){您可能希望将它们作为字典类型的对象或对象集合发送。然后在字典或集合上进行单个循环。@ryadavilli,有什么方法可以做到吗?谢谢!dasblinkenlight在下面给出了很好的解释和解决方法。我在下面的回答中简单解释了如何使用字典。您的问题是什么m位于这里。foreach(名称中的vari){foreach(值中的varo){您可能希望将它们作为字典类型的对象或对象集合发送。然后在字典或集合上做一个循环。@ryadavilli,有什么方法可以做到吗?谢谢!dasblinkenlight在下面给出了很好的解释和解决方法。我在下面的回答中简单解释了如何使用字典。当然可以这两个数组总是有相同的长度:)是的,但问题是这并不明显,只有你知道;-)。最好只有一个对象集合,每个对象都有两个属性。@GrayFullBuster如果你确定数组的长度和值,我在回答中给出了一个变通方法。但这仍然是个问题这不是一种很好的处理方法。两个数组的确定点是它们的长度总是相同的:)是的,但问题是这并不明显,只有你知道;-)。最好只有一个对象集合,每个对象都有两个属性。@GrayFullBuster如果你确定的话,我在回答中给出了一个变通方法ur数组长度和值。但这仍然不是一个很好的方法。n,v这些是数组?@GrayFullBuster否,这些是lambda的参数-Zip
方法的第二个参数。它描述了如何将名称和值配对到单个临时对象中,用于下一步构造XElement
.EDIT顺便说一句,我把表达式简化了一些,以便删除