2

xml ファイルを読み取るコードがあります。わからない部分もあります。私の理解では、コードは "Product" と "OtherDetails" の 2 つの要素を持つ xml ファイルを作成します。writer.WriteEndElement(); を使用するだけでよいのはなぜですか。writer.WriteStartElement を 2 回使用したときに 1 回ですか? 、各 writer.WriteStartElement ステートメントを writer.WriteEndElement() ステートメントで閉じるべきではありませんか?

using System.Xml;

public class Program
{
    public static void Main()
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;

        XmlWriter writer = XmlWriter.Create("Products.xml", settings);
        writer.WriteStartDocument();
        writer.WriteComment("This file is generated by the program.");
        writer.WriteStartElement("Product");          // first s
        writer.WriteAttributeString("ID", "001");
        writer.WriteAttributeString("Name", "Soap"); 
        writer.WriteElementString("Price", "10.00")  

        // Second Element 
        writer.WriteStartElement("OtherDetails");
        writer.WriteElementString("BrandName", "X Soap");
        writer.WriteElementString("Manufacturer", "X Company");
        writer.WriteEndElement();
        writer.WriteEndDocument();

        writer.Flush();
        writer.Close();
    }
}
using System;
using System.Xml;

public class Program
{
    public static void Main()
    {
        XmlReader reader = XmlReader.Create("Products.xml");

        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element
            && reader.Name == "Product")
            {
                Console.WriteLine("ID = " + reader.GetAttribute(0));  
                Console.WriteLine("Name = " + reader.GetAttribute(1));

                while (reader.NodeType != XmlNodeType.EndElement)
                {
                    reader.Read();
                    if (reader.Name == "Price")
                    {
                        while (reader.NodeType != XmlNodeType.EndElement)
                        {
                            reader.Read();
                            if (reader.NodeType == XmlNodeType.Text)
                            {
                                Console.WriteLine("Price = {0:C}", Double.Parse(reader.Value));
                            }
                        }

                        reader.Read();

                    } //end if


                    if (reader.Name == "OtherDetails")
                    {
                        while (reader.NodeType != XmlNodeType.EndElement)
                        {
                            reader.Read();
                            if (reader.Name == "BrandName")
                            {
                                while (reader.NodeType != XmlNodeType.EndElement)
                                {
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Text)
                                    {
                                        Console.WriteLine("Brand Name = " + reader.Value);
                                    }
                                }
                                reader.Read();
                            } //end if

                            if (reader.Name == "Manufacturer")
                            {
                                while (reader.NodeType != XmlNodeType.EndElement)
                                {
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Text)
                                    {
                                        Console.WriteLine("Manufacturer = " + reader.Value);
                                    }
                                }

                            } //end if
                        }
                    } //end if
                } //end while
            } //end if

        } //end while
    }
}

この部分がわかりません:

if (reader.Name == "OtherDetails")
{
    while (reader.NodeType != XmlNodeType.EndElement)
    {
        reader.Read();
        if (reader.Name == "BrandName")
        {
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                reader.Read();
                if (reader.NodeType == XmlNodeType.Text)
                {
                    Console.WriteLine("Brand Name = " + reader.Value);
                }
            }

while (reader.NodeType != XmlNodeType.EndElement)条件が 2 回使用されていることに注意してください。

なぜ指定する必要がないのですか

if (reader.NodeType == XmlNodeType.Element for OtherDetails)製品で行ったように、

このような

if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "OtherDetails")
{} 
4

3 に答える 3

0

率直なことが必要な場合(読書や調査は必要ありません)、私がしたことは次のとおりです。

最近、MenuStrip for WinForms 用のカスタム XML 解析メソッドを作成しました (何百もの項目があり、XML が最善の策でした)。

// load the document
// I loaded mine from my C# resource file called TempResources
XDocument doc = XDocument.Load(new MemoryStream(Encoding.UTF8.GetBytes(TempResources.Menu)));

// get the root element
// (var is an auto token, it becomes what ever you assign it)
var elements = doc.Root.Elements();

// iterate through the child elements
foreach (XElement node in elements)
{
     // if you know the name of the attribute, you can call it
     // mine was 'name'
     // (if you don't know, you can call node.Attributes() - this has the name and value)
     Console.WriteLine("Loading list: {0}", node.Attribute("name").Value);

     // in my case, every child had additional children, and them the same
     // *.Cast<XElement>() would give me the array in a datatype I can work with
     // menu_recurse(...) is just a resursive helper method of mine
     menu_recurse(node.Elements().Cast<XElement>().ToArray()));
}

(私の答えはここにもあります:LinqでXMLファイルを読む- 残念ながらLinqではありません)

于 2013-12-18T22:46:43.983 に答える
0

xml ファイルを読み取る場合、データセットを使用する必要があるとします。これは、xml ファイルが内部的にデータセットを使用してデータテーブルに変換されるためです。次のコード行を使用して、ファイルにアクセスし、データセットを xml データにバインドします。

    DataSet ds=new DataSet();
    ds.ReadXml(HttpContext.Current.Server.MapPath("~/Labels.xml");

DataSet は多くのデータテーブルで構成され、これらのデータテーブルの数は xml ファイル内の親子タグの数に依存します

于 2014-01-15T16:45:55.130 に答える