我的代码在
下面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吗?
样品是
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>
文件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>");
请提供更好的答案
答案 0 :(得分:4)
使用LINQ to XML选择<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"))));
答案 1 :(得分:1)
您可以在2个文档中加载2个xml文件,然后在其中一个文档中,您可以获取<SqlEye>
元素并将文档2 DocumentElement
附加为{{1在第一个xml文档中。