C# 查找唯一的元素值并使用组号创建/标记节点
让我再解释一遍 例如,如果我们有一个db表,我们查询一些列,并将这些列中的所有值相加,生成一个唯一键,将其保存为一个新列,并用数字更新另一个新列。再次循环,如果其他列值的组合与前一列值重复,则使用与前一个编号相同的值更新第二列,否则更新下一个序列号。我必须在xml文件中完成 e-g } 该程序读取所有值,但如何基于这些值同时将其写入同一xml文件。我的猜测是将Dictionary对象中的节点值组合保存为键,并将Stringbuilder sb值与其进行比较。如果在dictionary中找到,则不要在dictionary中创建新项,而是获取dictionary的值并以xml进行更新,但如何更新?请帮忙 谢谢C# 查找唯一的元素值并使用组号创建/标记节点,c#,xml,xmlreader,xmlwriter,C#,Xml,Xmlreader,Xmlwriter,让我再解释一遍 例如,如果我们有一个db表,我们查询一些列,并将这些列中的所有值相加,生成一个唯一键,将其保存为一个新列,并用数字更新另一个新列。再次循环,如果其他列值的组合与前一列值重复,则使用与前一个编号相同的值更新第二列,否则更新下一个序列号。我必须在xml文件中完成 e-g } 该程序读取所有值,但如何基于这些值同时将其写入同一xml文件。我的猜测是将Dictionary对象中的节点值组合保存为键,并将Stringbuilder sb值与其进行比较。如果在dictionary中找到,则不
QF好的,最后我使用XmlDocument得到了我的解决方案。仍在尝试使用LINQ to xml找到另一个解决方案 给你
static void Test(String _xmlFilename)
{
//string _path = @"C:\Development\XML\Batch1823.xml";
String _path = _xmlFilename;
XmlDocument xDoc = new XmlDocument();
Dictionary<string, int> _marks = new Dictionary<string, int>();
int _markCounter = 0;
xDoc.Load(_path);
foreach(XmlNode xRod in xDoc.SelectNodes("/ProductionLot/ProductionSet/Machine/Rod"))
{
String _finalRef = xRod.Attributes.GetNamedItem("finalReference").Value;
String _color = xRod.Attributes.GetNamedItem("color").Value;
foreach (XmlNode xPiece in xRod.SelectNodes("Piece"))
{
String _length = xPiece.Attributes.GetNamedItem("length").Value;
String _angle = xPiece.Attributes.GetNamedItem("angle").Value;
String _angleA = xPiece.Attributes.GetNamedItem("angleA").Value;
String _angleB = xPiece.Attributes.GetNamedItem("angleB").Value;
String _operStr = "";
foreach (XmlNode xOper in xPiece.SelectNodes("Operations/Operation"))
{
String _operName = xOper.Attributes.GetNamedItem("name").Value;
String _operXPos = xOper.Attributes.GetNamedItem("X").Value;
_operStr = _operStr + "//" + _operName + ":" + _operXPos;
}
String _pieceMark = _finalRef + "/" + _color + "/" + _length + "/" + _angle + "/" + _angleA + "/" + "/" + _operStr + "/" + _angleB;
String _markID = "0";
if (!_marks.ContainsKey(_pieceMark))
{
_markCounter += 1;
_marks.Add(_pieceMark, _markCounter);
_markID = _markCounter.ToString();
}
else
{
_markID = _marks[_pieceMark].ToString();
}
xPiece.Attributes.Append(xDoc.CreateAttribute("group")).Value = _markID;
}
}
xDoc.Save(_path);
}
因此,我们可以根据需要更改此处的节点名称。但是我的问题成功地解决了
享受
static void Test(String _xmlFilename)
{
//string _path = @"C:\Development\XML\Batch1823.xml";
String _path = _xmlFilename;
XmlDocument xDoc = new XmlDocument();
Dictionary<string, int> _marks = new Dictionary<string, int>();
int _markCounter = 0;
xDoc.Load(_path);
foreach(XmlNode xRod in xDoc.SelectNodes("/ProductionLot/ProductionSet/Machine/Rod"))
{
String _finalRef = xRod.Attributes.GetNamedItem("finalReference").Value;
String _color = xRod.Attributes.GetNamedItem("color").Value;
foreach (XmlNode xPiece in xRod.SelectNodes("Piece"))
{
String _length = xPiece.Attributes.GetNamedItem("length").Value;
String _angle = xPiece.Attributes.GetNamedItem("angle").Value;
String _angleA = xPiece.Attributes.GetNamedItem("angleA").Value;
String _angleB = xPiece.Attributes.GetNamedItem("angleB").Value;
String _operStr = "";
foreach (XmlNode xOper in xPiece.SelectNodes("Operations/Operation"))
{
String _operName = xOper.Attributes.GetNamedItem("name").Value;
String _operXPos = xOper.Attributes.GetNamedItem("X").Value;
_operStr = _operStr + "//" + _operName + ":" + _operXPos;
}
String _pieceMark = _finalRef + "/" + _color + "/" + _length + "/" + _angle + "/" + _angleA + "/" + "/" + _operStr + "/" + _angleB;
String _markID = "0";
if (!_marks.ContainsKey(_pieceMark))
{
_markCounter += 1;
_marks.Add(_pieceMark, _markCounter);
_markID = _markCounter.ToString();
}
else
{
_markID = _marks[_pieceMark].ToString();
}
xPiece.Attributes.Append(xDoc.CreateAttribute("group")).Value = _markID;
}
}
xDoc.Save(_path);
}