我的代码如下
int cnt = ScriptInfoList.Count;
for (int i = 0; i < cnt; i++)
{
var value = PrepareXMLDocument(ScriptInfoList[i]);
}
private static XDocument PrepareXMLDocument(ScriptInfo scriptInfo)
{
XDocument doc =
new XDocument(
new XElement("scriptfilenames",
new XElement("SqlEye",
new XElement("scriptfilename", new XAttribute("Name", scriptInfo.FileName), new XAttribute("Type", scriptInfo.ScriptType),
new XElement("SqlEyeWarnings",
sqlEyeWarnings.Select(x => new XElement("SqlEyeWarning", new XAttribute("value", x)))),
new XElement("FxCopsWarnings",
fxCopWarnings.Select(x => new XElement("FxCopsWarning", new XAttribute("value", x)))),
new XElement("SqlEyeRemarks",
sqlEyeRemarks.Select(x => new XElement("SqlEyeRemark", new XAttribute("value", x)))),
new XElement("FxCopsRemarks",
fxCopRemarks.Select(x => new XElement("FxCopsRemark", new XAttribute("value", x))))
))));
return doc;
}
我可以合并 mutilpe XDocuments 吗?
作为样本
文件 1
<scriptfilenames>
<SqlEye>
<scriptfilename Name="ws_CallLogs_GetByCallId.sql" Type="SP">
<SqlEyeWarnings>
<SqlEyeWarning value="SD030: object does not exist in database or is invalid for this operation in Database : ws_CallLogs @ line number : 63" />
</SqlEyeWarnings>
<FxCopsWarnings>
<FxCopsWarning value="Avoid using sp_ as a prefix for stored procedure " />
</FxCopsWarnings>
<SqlEyeRemarks>
<SqlEyeRemark value="SP017: Consider using EXISTS predicate instead of IN predicate @ line number : 1" />
</SqlEyeRemarks>
<FxCopsRemarks>
<FxCopsRemark value="Missing or order mismatch of Grant statement." />
</FxCopsRemarks>
</scriptfilename>
</SqlEye>
</scriptfilenames>
文件2
<scriptfilenames>
<SqlEye>
<scriptfilename Name="dbo.StopAutoRenewalEx.StoredProcedure.sql" Type="SP">
<SqlEyeWarnings />
<FxCopsWarnings>
<FxCopsWarning value="Missing schema while addressing object name" />
</FxCopsWarnings>
<SqlEyeRemarks>
<SqlEyeRemark value="SP016: Update statements should not update primary key @ line number : 70" />
</SqlEyeRemarks>
<FxCopsRemarks>
<FxCopsRemark value="Values hardcoded in where-clause condition " />
<FxCopsRemark value="Values hardcoded in where-clause condition " />
<FxCopsRemark value="Values hardcoded in where-clause condition " />
</FxCopsRemarks>
</scriptfilename>
</SqlEye>
</scriptfilenames>
合并后的将是
<scriptfilenames>
<SqlEye>
<scriptfilename Name="ws_CallLogs_GetByCallId.sql" Type="SP">
<SqlEyeWarnings>
<SqlEyeWarning value="SD030: object does not exist in database or is invalid for this operation in Database : ws_CallLogs @ line number : 63" />
</SqlEyeWarnings>
<FxCopsWarnings>
<FxCopsWarning value="Avoid using sp_ as a prefix for stored procedure " />
</FxCopsWarnings>
<SqlEyeRemarks>
<SqlEyeRemark value="SP017: Consider using EXISTS predicate instead of IN predicate @ line number : 1" />
</SqlEyeRemarks>
<FxCopsRemarks>
<FxCopsRemark value="Missing or order mismatch of Grant statement." />
</FxCopsRemarks>
</scriptfilename>
<scriptfilename Name="dbo.StopAutoRenewalEx.StoredProcedure.sql" Type="SP">
<SqlEyeWarnings />
<FxCopsWarnings>
<FxCopsWarning value="Missing schema while addressing object name" />
</FxCopsWarnings>
<SqlEyeRemarks>
<SqlEyeRemark value="SP016: Update statements should not update primary key @ line number : 70" />
</SqlEyeRemarks>
<FxCopsRemarks>
<FxCopsRemark value="Values hardcoded in where-clause condition " />
<FxCopsRemark value="Values hardcoded in where-clause condition " />
<FxCopsRemark value="Values hardcoded in where-clause condition " />
</FxCopsRemarks>
</scriptfilename>
</SqlEye>
</scriptfilenames>
我的解决方案是
StringBuilder sb = new StringBuilder();
sb.AppendLine("<scriptfilenames><SqlEye>");
int cnt = ScriptInfoList.Count;
for (int i = 0; i < cnt; i++)
{
var value = PrepareXMLDocument(ScriptInfoList[i]);
var findContent = value.Descendants("scriptfilename");
sb.AppendLine(value.Descendants("scriptfilename").ToList()[0].ToString());
}
sb.AppendLine("</SqlEye></scriptfilenames>");
请提供更好的答案