我的代码如下所示
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;
}锄头我能合并残缺的XDocuments吗?
如样
File1
<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>File2
<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>");请提供一个更好的答案
发布于 2013-05-24 10:43:40
使用LINQ选择<scriptfilename>元素的列表,并将它们添加到新的XDocument中:
var xmls = new List<XDocument>
{
XDocument.Load("File1.xml"),
XDocument.Load("File2.xml")
};
var resultXml = new XDocument(
new XElement("scriptfilenames",
new XElement("SqlEye",
xmls.Descendants("scriptfilename"))));发布于 2013-05-24 09:57:09
您只需将2个xml文件加载到2个文档中,然后在其中一个文档中获取<SqlEye>元素,并将document 2的DocumentElement作为第一个<SqlEye>文档的子文档追加。
https://stackoverflow.com/questions/16732259
复制相似问题