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;
}

複数の 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 に答える