Позвольте мне объяснить это снова.
Например, если у нас есть таблица db, мы запрашиваем некоторые столбцы и добавляем все значения в эти столбцы, чтобы создать уникальный ключ и сохранить новые столбцы и обновить новые столбцы с числом. Петля снова, и если снова комбинация других значений столбца повторяется с предыдущей, то обновите второй столбец с тем же значением, что и предыдущий номер, иначе следующий порядковый номер. Я должен сделать это в XML файле.
например.
Combinatin of
values from
different nodes Value
--------------- --------
A-B-C-D-E 1
A-B-C-D-F 2
A-B-C-D-G 3
A-B-C-D-E 1
namespace XMLdemo2
{
class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
// will use this dictionary object to store and compare node values
Dictionary<String, String> Rxml = new Dictionary<string, string>();
String rdsName = "";
String rdrValue = "";
using (XmlReader reader = mlReader.Create(@"C:\Development\XML\Batch1823.xml"))
{
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
reader.ReadToFollowing("Machine");
reader.MoveToAttribute("machineId");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
reader.ReadToFollowing("Rod");
reader.MoveToAttribute("finalReference");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
reader.MoveToAttribute("color");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
reader.MoveToAttribute("length");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
reader.ReadToFollowing("Piece");
reader.MoveToAttribute("angle");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
reader.MoveToAttribute("angleA");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
reader.MoveToAttribute("angleB");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
reader.ReadToFollowing("Operations");
if (reader.ReadToDescendant("Operation"))
{
do
{
reader.MoveToAttribute("name");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
reader.MoveToAttribute("X");
rdsName = reader.Name;
rdrValue = reader.Value;
sb.Append(rdsName).Append("=").Append(rdrValue);
} while (reader.ReadToNextSibling("Operation"));
}
break;
default:
break;
}
}
}
Console.ReadKey();
}
}
}
Эта программа считывает все значения, но как записать их одновременно с одним и тем же XML файлом на основе этих значений. Я предполагаю сохранить эту комбинацию значений узлов в объекте Dictionary как ключ и сравнить значение sb Stringbuilder с ним. если он найден в словаре, то не создавайте новый элемент в словаре, а получите значение словаря и обновления в xml, но как? пожалуйста помоги.
благодаря
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);
}
Поэтому мы можем изменить имена узлов здесь в соответствии с нашей потребностью. Но моя проблема решена успешно.
Наслаждаться....!