XAML阅读器重复打印

时间:2013-10-08 12:02:41

标签: c# wpf xaml

我的代码在点击按钮后调用此方法。此方法应使用行上的值在MessageBox键中打印。

public static void LoadFromFile()
{
    try
    {
        using (XmlReader xr = XmlReader.Create(@"config.xml"))
        {
            string sourceValue = "";
            string sourceKey = "";
            string element = "";
            string messageBox = "";

            while (xr.Read())
            {
                if (xr.NodeType == XmlNodeType.Element)
                {
                    element = xr.Name;
                    if (element == "source")
                    {
                        sourceKey = xr.GetAttribute("key");
                    }
                }
                else if (xr.NodeType == XmlNodeType.Text)
                {
                    if (element == "value")
                    {
                        sourceValue = xr.Value;
                    }
                }
                else if ((xr.NodeType == XmlNodeType.EndElement) && (xr.Name == "source"))
                {
                    // there is problem
                    messageBox += sourceKey + " " + sourceValue + "\n";
                }
            }
            MessageBox.Show(messageBox);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("" + ex);
    }
}

Method按照我想要的值打印每个键。 最后一个键值方法打印两次。在source config.xml中只有3个键和3个值,但方法打印4个键和4个值。

这是输出的例子:

  

key1 myValue1

     

key2 myValue2

     

key3 myValue3

     

key3 myValue3

另一个例子:

  狗窝织物

     猫喵

     

duck Quack

     

duck Quack

这是我的XAML代码:

<?xml version="1.0" encoding="utf-8"?>

<source>
  <source key="key1">
    <value>myValue1</value>
  </source>
  <source key="key2">
    <value>myValue2</value>
  </source>
  <source key="key3">
    <value>myValue3</value>
  </source>
</source>

2 个答案:

答案 0 :(得分:1)

您的外部元素也称为“源”

所以,最后有2个“源”结束元素。

答案 1 :(得分:1)

问题是根source的结束元素会导致您打印两次值。您可以通过为根元素选择其他名称或通过更改方法来解决此问题:

while (xr.Read())
{
    if (xr.NodeType == XmlNodeType.Element)
    {
        element = xr.Name;
        if (element == "source")
        {
            sourceKey = xr.GetAttribute("key");
        }
    }
    else if (xr.NodeType == XmlNodeType.Text)
    {
        if (element == "value")
        {
            sourceValue = xr.Value;
        }
    }
    else if (sourceValue != "" && (xr.NodeType == XmlNodeType.EndElement) && (xr.Name == "source"))
    {
        // there is problem
        messageBox += sourceKey + " " + sourceValue + "\n";
        sourceValue = "";
    }
}