3

我的代码如下

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>");

请提供更好的答案

4

2 回答 2

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"))));
于 2013-05-24T10:43:40.157 回答
1

您可以将 2 个 xml 文件加载到 2 个文档中,然后在其中一个文档中,您可以获得<SqlEye>元素并将文档 2 附加为第一个 xml 文档中DocumentElement的子级。<SqlEye>

于 2013-05-24T09:57:09.057 回答