0

私は C++ 開発者で、C# WPF プロジェクトに取り組み始めました。xml ファイルを読み取るメソッドがあります。私のC ++アプリケーションでは非常に効率的に実行できましたが、WPFでは問題へのアプローチ方法がわかりません。私のコードをお見せしましょう:

// When Browse Button is clicked this method is called
private void ExecuteScriptFileDialog()
    {
        var dialog = new OpenFileDialog { InitialDirectory = _defaultPath };
        dialog.DefaultExt = ".xml";
        dialog.Filter = "XML Files (*.xml)|*.xml";
        dialog.ShowDialog();
        ScriptPath = dialog.FileName; //ScriptPath contains the Path of the Xml File
        if (File.Exists(ScriptPath))
        {
            LoadAardvarkScript(ScriptPath);
        }
    }

    public void LoadAardvarkScript(string ScriptPath)
    {
        // I should read the xml file
    }

次のようにC++で達成しました:

File file = m_selectScript->getCurrentFile(); //m_selectScript is combobox name
if(file.exists())
{
   LoadAardvarkScript(file);
}

void LoadAardvarkScript(File file)
{   

XmlDocument xmlDoc(file);

//Get the main xml element
XmlElement *mainElement = xmlDoc.getDocumentElement();
XmlElement *childElement = NULL;
XmlElement *e = NULL;
int index = 0;
if(!mainElement )
{
    //Not a valid XML file.
    return ;
}

//Reading configurations...
if(mainElement->hasTagName("aardvark"))
{
    forEachXmlChildElement (*mainElement, childElement)
    {
        //Read Board Name
        if (childElement->hasTagName ("i2c_write"))
        {
            // Some code
        }
    }
}

C++ コードで行ったように、mainElementchildelemの両方のタグを取得するにはどうすればよいですか? :)

4

3 に答える 3

1

ここで xml ファイルのレイアウトがわからない場合は、Linq の使用方法を知っている場合に使用できる例です。

class Program
{
    static void Main(string[] args)
    {
        XElement main = XElement.Load(@"users.xml");

        var results = main.Descendants("User")
            .Descendants("Name")
            .Where(e => e.Value == "John Doe")
            .Select(e => e.Parent)
            .Descendants("test")
            .Select(e => new { date = e.Descendants("Date").FirstOrDefault().Value, points = e.Descendants("points").FirstOrDefault().Value });

        foreach (var result in results)
            Console.WriteLine("{0}, {1}", result.date, result.points);
        Console.ReadLine();
    }
}

XPATHを使用してxmlファイルを解析することもできます..しかし、実際にはxmlファイルのレイアウトを確認する必要があります

xmlreader を使用して実行する場合

System.Collections.Generic の使用; System.Linq を使用します。System.Text を使用します。System.Xml を使用します。

namespace XmlReading
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create an instance of the XmlTextReader and call Read method to read the file            
            XmlTextReader textReader = new XmlTextReader("C:\\myxml.xml");
            textReader.Read();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(textReader);

            XmlNodeList BCode = xmlDoc.GetElementsByTagName("Brandcode");
            XmlNodeList BName = xmlDoc.GetElementsByTagName("Brandname");
            for (int i = 0; i < BCode.Count; i++)
            {
                if (BCode[i].InnerText == "001")
                    Console.WriteLine(BName[i].InnerText);                
            }

            Console.ReadLine();
        }
    }
}
于 2012-10-10T16:59:17.893 に答える
0

Linq2Xmlを使用して、

var xDoc = XDocument.Load("myfile.xml");

var result = xDoc.Descendants("i2c_write")
                .Select(x => new
                {
                    Addr = x.Attribute("addr").Value,
                    Count = x.Attribute("count").Value,
                    Radix = x.Attribute("radix").Value,
                    Value = x.Value,
                    Sleep = ((XElement)x.NextNode).Attribute("ms").Value 
                })
                .ToList();

var khz = xDoc.Root.Element("i2c_bitrate").Attribute("khz").Value;
于 2012-10-10T17:04:42.807 に答える
0

LINQ クエリを使用して xml (XDocument) からデータを抽出する

XLinq の詳細については、このリンクを参照してください。

サンプル XML :

 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<People>
<Person id="1">
<Name>Joe</Name>
<Age>35</Age>
<Job>Manager</Job>
</Person>

<Person id="2">
<Name>Jason</Name>
<Age>18</Age>
<Job>Software Engineer</Job>
</Person>

</People>

サンプル Linq クエリ:

var names = (from person in Xdocument.Load("People.xml").Descendants("Person")
        where int.Parse(person.Element("Age").Value) < 30
        select person.Element("Name").Value).ToList();

名前は文字列のリストになります。このクエリは、18 歳のジェイソンを返します。

于 2012-10-10T16:56:30.997 に答える