我编写了一个从Excel文件读取的代码。然后将内部内容序列化为xml文件。如果内容在同一1个工作表中,则效果很好。
我现在的问题是,我在Excel文件中有2个工作表,需要将它们合并成1个xml文件。
第一个工作表=警告列表, 第二个工作表=错误列表
序列化xml文件时,警告列表将写在顶部,错误列表将显示在警告列表的末尾。
我的问题是:
如何使用c#将错误列表附加到xml文件中的警告列表下?因为我在Excel文件中有50行用于警告和错误
如果将来某个列表中有一个新项添加到其中,例如:错误列表中添加了新的错误消息和操作,如何在不影响警告列表内容的情况下覆盖它? p>
谢谢
这是我的代码:
clear
x = load('d:/ex2x.dat');
y = load('d:/ex2y.dat');
figure(1), clf, plot(x, y, '*'), xlabel('Age in years'), ylabel('Height in meters')
m = length(y); % store the number of training examples
x = [ones(m, 1), x]; % Add a column of ones to x
theta=[0,0]; alpha=0.07;
residuals = x*theta' - y ; %same as: sum(x.*theta,2)-y
theta = theta - alpha*mean(residuals.*x);
disp(theta)
预期的xml文件输出:
private void generateAlarm_List(Excel.Range _range, string filePath, int _alarmCodeColumn, int _alarmModuleColumn,
int _alarmMessageColumn, int _alarmActionColumn, int _alarmAddressCodeColumn)
{
try
{
SiemensAlarmEditorModel siemensAlarmEditorModel = new SiemensAlarmEditorModel()
{
SiemensPLCName = "blablabla",
SiemensS7Connection = 1,
SiemensAlarmAddressType = SiemensAddressType.MemoryBit
};
for (int i = 5; i <= _range.Rows.Count; i++)
{
object warningAlarmCode = (_range.Cells[i, _alarmCodeColumn] as Excel.Range).Value2;
object warningAlarmModule = (_range.Cells[i, _alarmModuleColumn] as Excel.Range).Value2;
object warningAlarmMessage = (_range.Cells[i, _alarmMessageColumn] as Excel.Range).Value2;
object warningAlarmAction = (_range.Cells[i, _alarmActionColumn] as Excel.Range).Value2;
object warningAlarmAddressCode = (_range.Cells[i, _alarmAddressCodeColumn] as Excel.Range).Value2;
object errorAlarmCode = (_range.Cells[i, _alarmCodeColumn] as Excel.Range).Value2;
object errorAlarmModule = (_range.Cells[i, _alarmModuleColumn] as Excel.Range).Value2;
object errorAlarmMessage = (_range.Cells[i, _alarmMessageColumn] as Excel.Range).Value2;
object errorAlarmAction = (_range.Cells[i, _alarmActionColumn] as Excel.Range).Value2;
object errorAlarmAddressCode = (_range.Cells[i, _alarmAddressCodeColumn] as Excel.Range).Value2;
if (warningAlarmCode != null && warningAlarmMessage != null
&& warningAlarmAction != null && warningAlarmAddressCode != null)
{
siemensAlarmEditorModel.SiemensAlarmWarningList.Add(new AlarmModel
{
AlarmCode = Convert.ToInt32(warningAlarmCode),
AlarmModule = warningAlarmModule.ToString(),
AlarmMessage = warningAlarmMessage.ToString(),
AlarmAction = warningAlarmAction.ToString(),
AlarmAddressCode = Convert.ToDouble(warningAlarmAddressCode.ToString().Trim().Remove(0, 2))
});
}
if (errorAlarmCode != null && errorAlarmMessage != null
&& errorAlarmAction != null && errorAlarmAddressCode != null)
{
siemensAlarmEditorModel.SiemensAlarmErrorList.Add(new AlarmModel
{
AlarmCode = Convert.ToInt32(errorAlarmCode),
AlarmModule = errorAlarmModule.ToString(),
AlarmMessage = errorAlarmMessage.ToString(),
AlarmAction = errorAlarmAction.ToString(),
AlarmAddressCode = Convert.ToDouble(errorAlarmAddressCode.ToString().Trim().Remove(0, 2))
});
}
}XmlTools.Serialize(filePath, siemensAlarmEditorModel);
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
答案 0 :(得分:0)
因为您的alarmEditorModel在警告列表和错误列表中有两个单独的条目,所以从理论上讲,您将使每个列表出现在根的两个不同元素下。如果要查找包含警告和错误的单个列表,则可以创建“ AlarmModel”的单个列表,然后序列化该列表。如果您无法控制它们的添加顺序,则可以将“ IsError”或“ IsWarning”的字段添加到“ AlarmModel”,然后用[System.Xml.Serialization.XmlIgnore]标记为防止它出现在输出中。然后,在序列化之前,您可以按该新字段对列表进行排序。
但是,在上面的代码中,您似乎在为警告和错误拉出相同的字段,因此所有内容始终会被标记为“警告”。我看不到您在哪里引用两个不同的工作表。如果要从sheet1和sheet2两次调用此方法,则无需将WARNING和ERROR分开。