2

case1 つまたは複数の xml ファイルからの 2 つの情報をオブジェクトのリストに取り込むにはどうすればよいですか?

私が試したすべての方法でゼロの結果が生成され、変数をチェックすると「列挙は結果を生成しませんでした」と表示されます。以下のコード例では、この結果を得るために使用しようとしたさまざまな方法を含めています (コメントアウトしています)。

これに対する答えがすでにある場合は、その方向に向けてください。付随する説明もいただければ幸いです。

コード スニペットは次のとおりです。

private void gatherInfo(ref List<Case> Cases)
{
    List<string> XMLFileNames = new List<string>();

    foreach (string caseID in txtbxCases.Lines)
    {
        Cases.Add(new Case(caseID));
    }

    XMLFileNames.AddRange(Directory.EnumerateFiles(txtbxXMLDirectory.Text, "*", SearchOption.AllDirectories).Select(Path.GetFileName));

    string currentFileName = "";

    for (int i = XMLFileNames.Count - 1; i >= 0; i--)
    {
        currentFileName = XMLFileNames[i];
        if (currentFileName.Substring(currentFileName.Length - 4, 4) != ".xml")
        {
            XMLFileNames.RemoveAt(i);
        }
    }

    // Start of Area that doesn't work correctly
    for (int i = XMLFileNames.Count - 1; i>=0; i--)
    {
        currentFileName = XMLFileNames[i];
        //XElement currentDoc = XElement.Load(txtbxXMLDirectory.Text + "\\" + currentFileName);
        XDocument currentDoc = XDocument.Load(txtbxXMLDirectory.Text + "\\" + currentFileName);
        XElement currentDocElements = XElement.Parse(currentDoc.ToString());

        for (int i2 = Cases.Count - 1; i2>=0; i2--)
        {
            string currentCaseID = Cases[i].GetCaseID();

            IEnumerable<XElement> currentCase =
                from el in currentDocElements.Descendants("Document");
                where (string)el.Element("CaseNumber") == currentCaseID
                select el;
            ///////////////////////////////////////////////////////////
            //var currentCase =
            //    from el in currentDocElements.Descendants("IndexFields")
            //    where (string)el.Element("CaseNumber") == currentCaseID
            //    select el;
            ///////////////////////////////////////////////////////////
            //var currentCase = currentDocElements.Descendants("IndexFields")
            //    .where(x => x.Element("IndexField").Value == currentCaseID);
            ///////////////////////////////////////////////////////////

            foreach (XElement el in currentCase)
            {
                Cases[i].AddFile(el.Element("SRCFilename").Value, el.Element("XMLFilename").Value);
            }
        }
    }

    //foreach (string filename in XMLFileNames)
    //{
    //    XElement currentDoc = XElement.Load(txtbxXMLDirectory.Text + "\\" + filename);
    //
    //    foreach (var caseID in Cases)
    //    {
    //        IEnumerable<XElement> currentCase = 
    //            from el in currentDoc.ElementsAfterSelf("IndexFields")//.Elements("IndexFields")
    //            //where (string)el.Element("CaseNumber") == caseID.GetCaseID()
    //            select el;
    //
    //        foreach (XElement el in currentCase)
    //        {
    //            caseID.AddFile(el.Element("SRCFilename").Value, el.Element("XMLFilename").Value);
    //        }
    //    }
    //}
}

以下は、実稼働XML ファイルに含まれるすべてのネストを含む XML ファイルの例です。

 <ImportSession>
 <Batches>
 <Batch BatchClassName="CaseFolder_XML">
 <Documents>
 <Document FormTypeName="Doc XML Form Type">
 <IndexFields>
 <IndexField Name="CaseNumber" Value="1"/>
 <IndexField Name="XMLFilename" Value="aaa.xml"/>
 <IndexField Name="SRCFilename" Value="aaa.pdf"/>
 </IndexFields>
 <Pages>
 <Page ImportFileName="c:\aaa.pdf"/>
 </Pages>
 </Document>
 <Document FormTypeName="Doc XML Form Type">
 <IndexFields>
 <IndexField Name="CaseNumber" Value="2"/>
 <IndexField Name="XMLFilename" Value="aaa.xml"/>
 <IndexField Name="SRCFilename" Value="aab.pdf"/>
 </IndexFields>
 <Pages>
 <Page ImportFileName="c:\aab.pdf"/>
 </Pages>
 </Document>
 <Document FormTypeName="Doc XML Form Type">
 <IndexFields>
 <IndexField Name="CaseNumber" Value="3"/>
 <IndexField Name="XMLFilename" Value="aaa.xml"/>
 <IndexField Name="SRCFilename" Value="aac.pdf"/>
 </IndexFields>
 <Pages>
 <Page ImportFileName="c:\aac.pdf"/>
 </Pages>
 </Document>
 <Document FormTypeName="Doc XML Form Type">
 <IndexFields>
 <IndexField Name="CaseNumber" Value="4"/>
 <IndexField Name="XMLFilename" Value="aaa.xml"/>
 <IndexField Name="SRCFilename" Value="aad.pdf"/>
 </IndexFields>
 <Pages>
 <Page ImportFileName="c:\aad.pdf"/>
 </Pages>
 </Document>
 <Document FormTypeName="Doc XML Form Type">
 <IndexFields>
 <IndexField Name="CaseNumber" Value="1"/>
 <IndexField Name="XMLFilename" Value="aaa.xml"/>
 <IndexField Name="SRCFilename" Value="aae.pdf"/>
 </IndexFields>
 <Pages>
 <Page ImportFileName="c:\aae.pdf"/>
 </Pages>
 </Document>
 <Document FormTypeName="Doc XML Form Type">
 <IndexFields>
 <IndexField Name="CaseNumber" Value="1"/>
 <IndexField Name="XMLFilename" Value="aaf.xml"/>
 <IndexField Name="SRCFilename" Value="aab.pdf"/>
 </IndexFields>
 <Pages>
 <Page ImportFileName="c:\aaf.pdf"/>
 </Pages>
 </Document>
 </Documents>
 </Batch>
 </Batches>
 </ImportSession>

本番環境では、次のことが当てはまります。

  • チェックする複数の xml ファイル
  • 1 つのケースが xml ファイルに複数回表示される場合がある
  • 同じファイルを複数のケースに追加できます
4

2 に答える 2

1

Cases[i2]多分あなたは代わりに読むべきCases[i]ですか?

for (int i2 = Cases.Count - 1; i2>=0; i2--)
{     // ^ counter for iterating over "Cases"

    string currentCaseID = Cases[i2].GetCaseID();
                              // ^ use correct counter here

    IEnumerable<XElement> currentCase =
        from el in currentDocElements.Descendants("Document");
        where (string)el.Element("CaseNumber") == currentCaseID
        select el;

    foreach (XElement el in currentCase)
    {
        Cases[i2].AddFile(el.Element("SRCFilename").Value, el.Element("XMLFilename").Value);
           // ^ and here
    }
于 2012-11-30T16:40:03.053 に答える
0
var xDoc = XDocument.Load("a.xml");
var allDocs = xDoc.Descendants("Document")
                .Select(doc=>new{
                    FormTypeName = doc.Attribute("FormTypeName").Value,
                    IndexFields = doc.Descendants("IndexField")
                                    .ToDictionary(x=>x.Attribute("Name").Value,
                                                  x=>x.Attribute("Value").Value)
                })
                .ToList();

XPathを使用することもできます

string xpath = "//Document[IndexFields/IndexField[@Name='CaseNumber' and @Value='3']]";
var docElement = xDoc.XPathSelectElement(xpath);
于 2012-11-30T16:46:15.863 に答える