2

私は次のようなXMLファイルを見ています:

<test>
   <vehiclenumber>123</vehiclenumber>
   <form>
     <form_id>1</form_id>
     <datafield>
         <fieldnumber>1</fieldnumber>
         <data>
            <datawords>
               <datatext1>1234</datatext1>
               <mc2>656865</mc2>
            </datawords>
         </data>
      </datafield>
   </form>
</test>

現在、私は次のコードを持っています:

IEnumerable<XElement> elements = documentXDoc.Descendants("test");

            _fuelReceipts.AddRange(elements
                .Select(receipt => new Receipt()
                {
                    vehicle_number = receipt.Element("vehiclenumber") == null ? "" : receipt.Element("vehiclenumber").Value,
                    field = receipt.Descendants("datafield")
                    .Select(x => new Field()
                    {
                        field_number = x.Element("fieldnumber") == null ? "" : x.Element("fieldnumber").Value,
                        event_data = x.Descendants("data")
                        .Select(y => new FieldData()
                        {
                            event_data = y.Value
                        }).ToList()
                    }).ToList()
                }));
        }

ここでの問題は、<data>私にとって、そこに何人の子孫がいるのか、彼らが何と呼ばれるのかわからないということです。この情報を知らなくても、これらを個別に解析する方法はありますか?今のところ、1234656865のようなものが得られますが、実際には、オブジェクトに1234を入れ、同じオブジェクト内の別のオブジェクトに656865を入れたい場合です。

4

2 に答える 2

1

内部の「データ」選択を次のように変更します。

event_data = x.Descendants("data").Descendants().Where(d => !d.HasElements).Select(y => y.Value).ToList()

これにより、string1234と656865の2つの要素を含むリストが表示されます。次のString.Join()メソッドを使用して、1つの文字列に簡単に結合できます。

event_data = String.Join(" ", x.Descendants("data").Descendants().Where(d => !d.HasElements).Select(y => y.Value).ToList())
于 2012-04-09T15:07:06.777 に答える
1

XMLの子孫の名前には意味があると思います。このコードは、それらをFieldオブジェクトに抽出するときに、それらを辞書に入れます。

void Main()
{
    string input = "<test><vehiclenumber>123</vehiclenumber><form><form_id>1</form_id><datafield>";
    input += "<fieldnumber>1</fieldnumber><data><datawords>";
    input += "<datatext1>1234</datatext1><mc2>656865</mc2>";
    input += "</datawords></data></datafield></form></test>";

    XDocument documentXDoc = XDocument.Parse(input);
    IEnumerable<XElement> elements = documentXDoc.Descendants("test");

    IEnumerable<Receipt> _fuelReceipts =  elements
        .Select(receipt => new Receipt()
        {
            vehicle_number = receipt.Element("vehiclenumber") == null ? "" : receipt.Element("vehiclenumber").Value,
            field = receipt.Descendants("datafield")
            .Select(x => new Field()
            {
                field_number = x.Element("fieldnumber") == null ? "" : x.Element("fieldnumber").Value,
                event_data = x.Elements("data").Descendants()
                    .Where(d => !d.HasElements)
                    .ToDictionary(d => d.Name.LocalName, d => d.Value)
            }).ToList()
        });
}

class Receipt {
    public string vehicle_number { get; set; }
    public List<Field> field { get; set; }
}

class Field {
    public string field_number { get; set; }
    public Dictionary<string, string> event_data { get; set; }
}
于 2012-04-09T15:16:25.310 に答える