0

XML でデータベースを作成する方法を試しています。以下のように、データの書き込みに成功しました。

<Employees>
    <Worker>
        <ID>1</ID>
        <FirstName>Ilan</FirstName>
        <LastName>Berlinbluv</LastName>
        <Salary>5000</Salary>
    </Worker>
</Employees>  

問題は、このコードを使用して読み取ろうとすると、次のようになることです。

    string writePath = Environment.ExpandEnvironmentVariables("%USERPROFILE%") + @"\Desktop";
    string writeFile = writePath + @"\Employees.xml";

    using (XmlReader read = XmlReader.Create(writeFile))
    {
        while (read.Read())
        {
            if (read.IsStartElement())
            {
                Console.WriteLine("DEBUG: read.Name = {0}", read.Name);
                Console.WriteLine("DEBUG: read.Value = {0}", read.Value);
                switch (read.Name)
                {
                    case "Employees":
                        Console.WriteLine("Start <Employees> master element");
                        break;
                    case "Employee":
                        Console.WriteLine("Start <Employee> element");
                        break;
                    case "Worker":
                        Console.WriteLine("Start <Worker> element");
                        break;
                    case "ID":
                        Console.WriteLine("Start reading <ID> element");
                        Console.WriteLine("Contains: " + read.Value.Trim());
                        break;
                    case "FirstName":
                        Console.WriteLine("Start reading <FirstName> element");
                        Console.WriteLine("Contains: " + read.Value.Trim());
                        break;
                    case "LastName":
                        Console.WriteLine("Start reading <LastName> element");
                        Console.WriteLine("Contains: " + read.Value.Trim());
                        break;
                    case "Salary":
                        Console.WriteLine("Start reading <Salary> element");
                        Console.WriteLine("Contains: " + read.Value.Trim());
                        break;
                }
            }
            Console.ReadKey();
        }
    }

それが言うときはいつでも値を適切に読み取らずStart reading <Salary> element、その後Contains:、値は表示されませんが、値があるはずです:5000.それは構文エラーですか、私はそれが必要です:

<ID>
1
</ID>  

私はdotnetperls チュートリアルを行ってきましたが、役に立ちませんでした。

4

6 に答える 6

0

XML 文書を読み取るためのコードを作成しようとしないでください。代わりに、組み込みの XML シリアライザーを使用してください。http://msdn.microsoft.com/en-us/library/fa420a9y.aspx

于 2013-10-31T10:43:57.300 に答える
0

XML ファイルの特定のノードにアクセスする最も簡単な方法は、LINQ を使用することです。

string writePath = Environment.ExpandEnvironmentVariables("%USERPROFILE%") + @"\Desktop";
string writeFile = writePath + @"\Employees.xml";

XDocument xmlDocument = XDocument.Load(writeFile)

次に、 Worker 要素内のすべての要素を読み取りたい場合

var queryResult = from x in xmlDocument.Root.Element("Worker").Elements() select x;
foreach (var item in queryResult)
{
    Console.WriteLine(item.Value);
}

または、すべての Worker 要素を別々に処理したい場合は、クエリ結果をリストにキャストするだけです

var queryResult = (from x in xmlDocument.Root.Element("Worker").Elements() select x).ToList();
Console.WriteLine("Start reading <ID> element");
Console.WriteLine("Contains: " + queryResult[0]);

Console.WriteLine("Start reading <FirstName> element");
Console.WriteLine("Contains: " + queryResult[1]);

Console.WriteLine("Start reading <LastName> element");
Console.WriteLine("Contains: " + queryResult[2]);

Console.WriteLine("Start reading <Salary> element");
Console.WriteLine("Contains: " + queryResult[3]);
于 2013-10-31T10:56:10.463 に答える
0

XSD ツールを使用して、シリアライザーを使用できます。最初に XML スキーマを作成し、次に XML スキーマからクラスを作成します。次に、XML をオブジェクトに直接読み取ることができます。

        /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="xml"></param>
    /// <exception cref="InvalidOperationException"></exception>
    /// <returns></returns>
    public static T Deserialize<T>(XmlNode xml)
    {
        // Assuming xml is an XML document containing a serialized object.
        XmlNodeReader reader = new XmlNodeReader(xml);

        // When we get the xml, it is usually a sub element that can have a different name, than the type name. Therefore look for the name
        XmlSerializer ser = new XmlSerializer(typeof(T));
        object obj = ser.Deserialize(reader);

        // Then you just need to cast obj into whatever type it is eg:
        return (T)obj;
    }
    /// <summary>
    /// Serializes without removing namespace and using the specified encoding
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <param name="encoding"></param>
    /// <returns></returns>
    /// <exception cref="InvalidOperationException">When the object can not be serialized to xml</exception>
    public static XmlDocument Serialize<T>(T obj, Encoding encoding)
    {
        XmlSerializer ser = GetSerializer(obj.GetType());
        using (MemoryStream stream = new MemoryStream())
        using (XmlTextWriter writer = new XmlTextWriter(stream, encoding))
        {
            ser.Serialize(writer, obj);
            XmlDocument doc = new XmlDocument();
            writer.Flush();
            stream.Position = 0;
            doc.Load(stream);
            return doc;
        }
    }

タイプが正しいことを確認するために、クラスを作成する前に XML スキーマを編集することをお勧めします。

于 2013-10-31T10:51:26.043 に答える
0
You can read XML like: 
 XmlDocument doc = new XmlDocument();
 doc.Load(Server.MapPath("\\foldername\\" + "filename.xml"));
 XmlNode node = doc.SelectSingleNode("//Employees//Worker/Salary");
 Response.Write(node.InnerText.ToString());

 This way, you can get 5000 as Salary. 
于 2013-10-31T10:47:10.513 に答える
0

ビジネス オブジェクトとの間でシリアル化する場合は、XML を使用する方が常に簡単です。

[Serializable]
public class Employees
{
    private List<Worker> _Workers;
    [XmlArray]
    public List<Worker> Workers
    {
        get { return _Workers; }
        set { _Workers = value; }
    }
}

[Serializable]
public class Worker
{
    public Int32 ID { get; set; }
    public String FirstName { get; set; }
    // etc.


    public void SerializeToXML(string outputFolderLocation)
    {
        try
        {
            if (!outputFolderLocation.EndsWith('\\'))
            {
                outputFolderLocation += "\\";
            }

            //Create our own namespaces for the output
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

            //Add an empty namespace and empty value
            ns.Add("", "");

            XmlSerializer serializer = new XmlSerializer(typeof(Worker));
            string outpath = outputFolderLocation + "FileName-" + DateTime.Now.ToBinary().ToString() + ".xml";
            XmlTextWriter textWriter = new XmlTextWriter(outpath, Encoding.GetEncoding("ISO-8859-1"));
            serializer.Serialize(textWriter, this, ns);
            textWriter.Close();
        }
        catch (Exception ex)
        {
            throw new Exception("Error serializing to XML", ex);
        }
    }
}

ノードの代わりに値を XML 属性にすることで、XML を整理することもできます。これを行うには、プロパティを次のように変更します。

[XmlAttribute("ID-Value")]
public Int32 ID { get; set; }
// would serialise like this <worker ID-Value="1"></worker>
于 2013-10-31T10:57:13.347 に答える