1

以下のコードを確認し、期待される出力に示されているように出力の最後の行を追加するために何をする必要があるかをアドバイスしてください

class test {

   static void Main(string[] args)
    {

        XDocument doc = XDocument.Load("E:\\BI_analytics\\Data\\so.xml");
        var query = from test in doc.Descendants("tester")
                    from testreq in test.Descendants("testRequest")
                    from testresp in test.Descendants("testResponse")
                    let id = testreq.Element("id") == null ? string.Empty : testreq.Element("id").Value

                  //  select id;
                    from itm in testresp.Descendants("item")
                    select new
                    {
                        ID = (string)id,
                        Name = (string)itm.Attribute("itemname"),
                        Code = (string)itm.Attribute("itemocde"),
                    };


        foreach (var result in query)
        {
            Console.WriteLine(result);
        }
    }
}

現在の出力

{ID = 2、名前=テスト項目1、コード= 111}
{ID = 2、名前=テスト項目2、コード= 222}
{ID = 3、名前=テスト項目3、コード= 333}
{ID = 3、名前=テスト項目4、コード= 444}

期待される出力

{ID = 2、名前=テスト項目1、コード= 111}
{ID = 2、名前=テスト項目2、コード= 222}
{ID = 3、名前=テスト項目3、コード= 333}
{ID = 3、名前=テスト項目4、コード= 444}
{ID = 4、名前=、コード=}
<?xml version="1.0" encoding="utf-8"?>
<root>
  <tester>
    <testRequest>
      <id>2</id>
    </testRequest>
    <testResponse>
      <items>
        <item itemname="test item1" itemocde="111"/>
        <item itemname="test item2" itemocde="222"/>
      </items>
    </testResponse>
  </tester>
  <tester>
    <testRequest>
      <id>3</id>
    </testRequest>
    <testResponse>
      <items>
        <item itemname="test item3" itemocde="333"/>
        <item itemname="test item4" itemocde="444"/>
      </items>
    </testResponse>
  </tester>
  <tester>
    <testRequest>
      <id>4</id>
    </testRequest>
    <testResponse>
      <items />
    </testResponse>
  </tester>
</root>
4

2 に答える 2

3

次のようなnullの場合でも、クラスを使用して値を返すことができます。

public static class LinqToXMLUtility
{
    /// <summary>
    /// Used to Get check the XElement Value and return 
    /// empty string if it is null (used for optional or missing xml items)
    /// </summary>
    /// <param name="pElement"></param>
    /// <param name="pstrElementName"></param>
    /// <returns></returns>
    public static string GetXElementValue(XElement pElement, string pstrElementName)
    {
        string strRet = string.Empty;
        try
        {
            XElement lElement = pElement.Element(pstrElementName);
            if (lElement != null)
            {
                strRet = lElement.Value;
            }
        }
        catch { }
        return strRet;
    }
}

そして、そのようにそれを使用してください。

class test
{
    static void Main(string[] args)
    {
        XDocument doc = XDocument.Load("E:\\BI_analytics\\Data\\so.xml");
        var query = from test in doc.Descendants("tester")
                    from testreq in test.Descendants("testRequest")
                    from testresp in test.Descendants("testResponse")
                    let id = testreq.Element("id") == null ? string.Empty : 
                             testreq.Element("id").Value

                    //  select id;
                    from itm in testresp.Descendants("item")
                    select new
                    {
                        ID = LinqToXMLUtility.GetXElementValue(itm, "id"),
                        Name = LinqToXMLUtility.GetXElementValue(itm, "itemname"),
                        Code =  LinqToXMLUtility.GetXElementValue(itm, "itemocde"),
                    };


        foreach (var result in query)
        {
            Console.WriteLine(result);
        }
    }
}
于 2012-05-31T16:25:10.480 に答える
2

これが問題です:

from itm in testresp.Descendants("item")

要素がないのでitem、おそらく次のようにします。

from itm in testresp.Descendants("item").DefaultIfEmpty()

...必要な時点:

select new
{
    ID = (string)id,
    Name = itm == null ? "" : (string)itm.Attribute("itemname"),
    Code = itm == null ? "" : (string)itm.Attribute("itemocde"),
};
于 2012-05-31T16:25:09.880 に答える