如何连接文件

本文关键字:文件 连接 何连接 | 更新日期: 2023-09-27 18:15:04

我的代码如下

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

请提供一个更好的答案

如何连接文件

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

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