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

使用 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();

名称将是字符串列表。此查询将返回 Jason,因为他 18 岁。

于 2012-10-10T16:56:30.997 回答
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 回答