2

XML ファイルは次のとおりです。

<AppBuilderProject>
    <Name>Project1</Name>
    <AppBuilderForms>
        <AppBuilderForm>
            <Title>Form1</Title>
            <AppBuilderFormObjects>
                <CheckMarkObject>
                    <Name>subscribeCheckmark</Name>
                    <Label>Subscribe</Label>
                    <IsChecked>1</IsChecked>
                </CheckMarkObject>
                <DateTimeObject>
                    <Name>dateOfBirth</Name>
                    <Label>Date of Birth</Label>
                </DateTimeObject>
                <LocationObject>
                    <Name>mapLocation</Name>
                    <Label>Any Location</Label>
                    <Longitude>1.23453</Longitude>
                    <Latitude>1.2345</Latitude>
                </LocationObject>
                <SwitchObject>
                    <Name>newsletterSwitch</Name>
                    <Label>Receive Newsletter</Label>
                    <IsChecked>1</IsChecked>
                </SwitchObject>
                <TextViewObject>
                    <Name>detailTextView</Name>
                    <Value>Details</Value>
                </TextViewObject>
                <TextFieldObject>
                    <Name>nameTextField</Name>
                    <Label>Name</Label>
                    <Value>name</Value>
                </TextFieldObject>
                <PhotoPickerObject>
                    <Name>photoPicker</Name>
                    <Label>Pick Photo</Label>
                </PhotoPickerObject>
                <SpinWheelPickerObject>
                    <Name>comboBox</Name>
                    <Label>Countries</Label>
                    <SpinWheelPickerColumns>
                        <SpinWheelPickerColumnObject>
                            <Name>name</Name>
                            <Label>Name</Label>
                            <SpinWheelPickerItems>
                                <SpinWheelPickerItemObject>
                                    <Name>Pakistan</Name>
                                    <Label>Pakistan</Label>
                                </SpinWheelPickerItemObject>
                                <SpinWheelPickerItemObject>
                                    <Name>United Arab Emirates</Name>
                                    <Label>United Arab Emirates</Label>
                                </SpinWheelPickerItemObject>
                            </SpinWheelPickerItems>
                        </SpinWheelPickerColumnObject>
                        <SpinWheelPickerColumnObject>
                            <Name>code</Name>
                            <Label>Code</Label>
                            <SpinWheelPickerItems>
                                <SpinWheelPickerItemObject>
                                    <Name>+92</Name>
                                    <Label>+92</Label>
                                </SpinWheelPickerItemObject>
                                <SpinWheelPickerItemObject>
                                    <Name>+971</Name>
                                    <Label>+971</Label>
                                </SpinWheelPickerItemObject>
                            </SpinWheelPickerItems>
                        </SpinWheelPickerColumnObject>
                    </SpinWheelPickerColumns>
                </SpinWheelPickerObject>
            </AppBuilderFormObjects>
        </AppBuilderForm>
    </AppBuilderForms>
</AppBuilderProject>

そして、すべての値を取得したい。そして、このコードを使用して、XML 内のすべての値を見つけます。

このコードはルート ノードのみを読み取ります。

XmlDocument DOC = new XmlDocument();
//  DOC.RemoveAll();
DOC.Load("C:\\Users\\DIGITEL EYE SYSTEM\\Desktop\\response.xml");
XmlNode firstnode = DOC.SelectSingleNode("AppBuilderProject");
Project.Name = firstnode["Name"].InnerText;
XmlNode secondnode = DOC.SelectSingleNode("AppBuilderProject/AppBuilderForm");
XmlNodeList controlingnode = secondnode.SelectNodes("Title");



XmlNodeList ParentNode = DOC.GetElementsByTagName("AppBuilderProject");

foreach (XmlNode AllNodes in ParentNode)
{
    Project.Name = AllNodes["Name"].InnerText;


    if (AllNodes.ChildNodes == DOC.GetElementsByTagName("AppBuilderForms"))
    {
        //  Project.Forms = DOC.GetElementsByTagName("");
        // String sb = AllNodes["Forms"].InnerText;
    }
    XmlNodeList checkmarknode = DOC.GetElementsByTagName("CheckMarkObject");

    if (checkmarknode.Item(0).InnerText == "Name")
    {
        checkmark.Name = checkmarknode[0].InnerText;
    }
    else if (checkmarknode.Item(1).InnerText == "Label")
    {
        checkmark.Label = checkmarknode[1].InnerText;
    }
    // if (AllNodes.ChildNodes == DOC.GetElementsByTagName("CheckMarkObject"))
    //  {
    //     checkmark.Name = AllNodes["Name"].InnerText;


    //   checkmark.Label = AllNodes["Label"].InnerText;
    // checkmark.IsChecked = AllNodes["IsChecked"].InnerText;
    // }

    if (ParentNode == DOC.GetElementsByTagName("DateTimeObject"))
    {
        DateTime.Name = AllNodes["Name"].InnerText;
        DateTime.Label = AllNodes["Label"].InnerText;
    }

    if (ParentNode == DOC.GetElementsByTagName("LocationObject"))
    {
        Location.Name = AllNodes["Name"].InnerText;
        Location.Label = AllNodes["Label"].InnerText;
        Location.Longitude = AllNodes["Longitude"].InnerText;
        Location.Latitude = AllNodes["Latitude"].InnerText;
    }

    if (ParentNode == DOC.GetElementsByTagName("SwitchObject"))
    {
        Switch.Name = AllNodes["Name"].InnerText;
        Switch.Label = AllNodes["Label"].InnerText;
        // Switch.IsChecked = AllNodes["IsChecked"].InnerText;
    }

    if (ParentNode == DOC.GetElementsByTagName("TextViewObject"))
    {
        TextView.Name = AllNodes["Name"].InnerText;
        TextView.Value = AllNodes["Value"].InnerText;
    }

    if (ParentNode == DOC.GetElementsByTagName("TextFieldObject"))
    {
        TextField.Name = AllNodes["Name"].InnerText;
        TextField.Value = AllNodes["Value"].InnerText;
    }

    if (ParentNode == DOC.GetElementsByTagName("PhotoPickerObject"))
    {
        PhotoPicker.Name = AllNodes["Name"].InnerText;
        PhotoPicker.Label = AllNodes["Label"].InnerText;
    }

    if (ParentNode == DOC.GetElementsByTagName("SpinWheelPickerObject"))
    {
        SpinWheelPicker.Name = AllNodes["Name"].InnerText;
        SpinWheelPicker.Label = AllNodes["Label"].InnerText;
        // SpinWheelPicker.Columns = AllNodes["Columns"].InnerText;
    }

しかし、ルートノードの値しか取得できないので、解決策を教えてください。ありがとう

4

4 に答える 4

2

LINQ2XMLあまりにもシンプルでクールな使い方

xml他のAPI の完全な代替品です。

XElement doc=XElement.Load("yourXML.xml");
doc.Descendants("AppBuilderProject").Element("Name").Value;//name value
doc.Descendants("AppBuilderForms").Descendants("AppBuilderForm").Element("Title").Value;//title value
于 2012-11-06T11:38:14.897 に答える
1

一般に、すべての要素を同じ階層レベルにあると見なして XmlDocument をナビゲートすることは望ましくありません。Xml には、1:N、ネストなどの複雑な関係を含むことができる階層構造があります。

したがって、ループして次のようなコードを書く代わりに

 if (ParentNode == DOC.GetElementsByTagName("SpinWheelPickerObject"))
 {
   SpinWheelPicker.Name = AllNodes["Name"].InnerText;
   ...
 }

XmlDocument/XmlNodeでは、必要な要素 / 属性に移動するために Xpath を使用することが望ましいでしょう。

   SpinWheelPicker.Name = 
     DOC.SelectSingleNode("/AppBuilderProject//SpinWheelPickerObject/Name")
        .InnerText;

編集

1:N の関係を反復するには、 を使用foreachしてコレクションを反復する必要があります。

foreach (XmlNode node in DOC.SelectNodes("//SpinWheelPickerItemObject"))
{
   System.Diagnostics.Trace.WriteLine(node.InnerText);
}

ここでも//ショートカットを使用して、階層をたどらないようにしています。ただし、これは階層を無視することに注意してください。つまりSpinWheelPickerItemObject、ドキュメント内の任意の場所で名前が付けられた要素が含まれます。

于 2012-11-06T11:38:32.283 に答える
0

この LINQ はジョブを実行できます。アイデアは、すべての XmlNodes をフェッチし、そのタイプが Text かどうかを確認することです。

using (var fs = new FileStream("somedata.xml", FileMode.Open))
{
    var Values = XElement.Load(fs).DescendantNodes()
                         .Where(item => item.NodeType == XmlNodeType.Text);
}
于 2012-11-06T11:37:25.710 に答える
0

XDocument/を使用XElementするとより簡単になり、linq も非常に簡単に実行できます。

XElement xmlObject = XElement.Load(fileName);
var xDoc = xmlObject.Descendants("AppBuilderProject") //will return you all the elements
于 2012-11-06T11:36:37.483 に答える