-1

当我的 XML 如下所示时,我如何从节点读取 XML 属性的特定值:

<Settings>
  <Display_Settings>
    <Screen>
      <Name Name="gadg" />
      <ScreenTag Tag="asfa" />
      <LocalPosition X="12" Y="12" Z="12" />
    </Screen>
  </Display_Settings>
</Settings>

我只知道如何读取 XML 的内部文本值而不是属性值。例如,我想要 LocalPosition 中 X 的值。到目前为止,这是我尝试过的;

    XmlNodeList nodeList = xmlDoc.GetElementsByTagName("Screen");

    foreach (XmlNode nodeInfo in nodeList)
    {
        XmlNodeList nodeContent = nodeInfo.ChildNodes;

        foreach (XmlNode nodeItems in nodeContent)
        {
            if (nodeItems.Name == "Tag")
            {
                print("There is a name");
            }
            if (nodeItems.Name == "LocalPosition")
            {
                print("TEST");
            }
        }
    }

尽管对于我想做的事情,我认为这是错误的做法。有人可以指出正确的方向吗?

4

4 回答 4

4

您可以使用LINQ to XML

var xdoc = XDocument.Load(path_to_xml);
int x = (int)xdoc.Descendants("LocalPosition").First().Attribute("X");

或者使用XPath

int x = (int)xdoc.XPathSelectElement("//LocalPosition").Attribute("X");
于 2013-06-03T08:26:35.417 回答
0

尝试nodeItems.Attributes["X"].Value

于 2013-06-03T08:23:33.267 回答
0
string XValue= nodeItems.Attributes["X"].Value; // will solve your problem.
于 2013-06-03T08:28:31.390 回答
0

当我第一次开始用 C# 解析 XML 时,我也有点困惑!.NET 提供了 System.XML.Linq 和 System.XML.Serialization 来帮助我们完成所有困难的事情,而不是尝试自己编写所有内容!

这种方法略有不同,因为我们:

  1. 将 XML 文档加载到 System.XML.Linq.XDocument 中,
  2. 将 XDocument 反序列化为我们可以随意使用的 .NET 对象 =]

我希望您不介意,但我稍微调整了您的 XML 示例。尽量避免在元素中使用太多属性,因为它们往往会降低可读性。XML 示例的第一行只是突出显示正在使用的版本。

您应该能够将下面的代码示例复制并粘贴到新的控制台应用程序中,以了解它的工作原理。只需确保您的 XML 文件位于 ..\bin\Debug 文件夹中(否则您需要提供完整的文件路径引用)。

如您所见,在此示例中,您的 XML 元素(Display_Settings、Screen、Name、ScreenTag 和 LocalPosition)都是我们用 XMLElement 属性装饰的类。这些类只有在我们调用 Deserialize() 时会自动填充的公共属性。整洁的!

这同样适用于 X、Y 和 Z 属性。

有很多教程可以比我更好地解释这一点 - 享受吧!=]

XML 示例

<?xml version="1.0"?>
<Settings>
  <Display_Settings>
    <Screen>
        <Name>NameGoesHere</Name>
        <ScreenTag>ScreenTagGoesHere</ScreenTag>
        <LocalPosition X="12" Y="12" Z="12" />
    </Screen>
  </Display_Settings>
</Settings>

完整的代码示例

using System;
using System.Xml.Linq;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create XDocument to represent our XML file
            XDocument xdoc = XDocument.Load("XmlFile.xml");

            // Create a deserializer and break down our XML into c# objects
            XmlSerializer deserializer = new XmlSerializer(typeof(Settings));

            // Deserialize into a Settings object
            Settings settings = (Settings)deserializer.Deserialize(xdoc.CreateReader());

            // Check that we have some display settings
            if (null != settings.DisplaySettings)
            {
                Screen screen = settings.DisplaySettings.Screen;
                LocalPosition localPosition = screen.LocalPosition;

                // Check to make sure we have a screen tag before using it
                if (null != screen.ScreenTag)
                {
                    Console.WriteLine("There is a name: " + screen.ScreenTag);
                }

                // We can just write our integers to the console, as we will get a document error when we
                // try to parse the document if they are not provided!
                Console.WriteLine("Position: " + localPosition.X + ", " + localPosition.Y + ", " + localPosition.Z);
            }            

            Console.ReadLine();
        }
    }

    [XmlRoot("Settings")]
    public class Settings
    {
        [XmlElement("Display_Settings")]
        public DisplaySettings DisplaySettings { get; set; }
    }

    public class DisplaySettings
    {
        [XmlElement("Screen")]
        public Screen Screen { get; set; }
    }

    public class Screen
    {
        [XmlElement("Name")]
        public string Name { get; set; }

        [XmlElement("ScreenTag")]
        public string ScreenTag { get; set; }

        [XmlElement("LocalPosition")]
        public LocalPosition LocalPosition { get; set; }
    }

    public class LocalPosition
    {
        [XmlAttribute("X")]
        public int X { get; set; }

        [XmlAttribute("Y")]
        public int Y { get; set; }

        [XmlAttribute("Z")]
        public int Z { get; set; }
    }
}
于 2013-06-03T09:44:06.343 回答