c# - 如何反序列化 XML 中特定元素中属性的特定值?

标签 c# xml xml-parsing deserialization xml-deserialization

我需要做的只是使用 System.XML 读取 Packet Name="PacketOut"中声明的 UnityObject 值。 任何帮助将不胜感激,在此先感谢。 这是 XML 片段:

 <IOConfig>

    <Packet Name="PacketOut" RemoteAddress="10.0.2.250" RemotePort="2020" NetworkInterface="ETH0" >
      <Signal Type="float" Name="x_out"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="y_out"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="z_out"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="alpha_out"    Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="theta_out"    Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="phi_out"      Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>

      <Signal Type="float" Name="x_out1"        Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="y_out1"        Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="z_out1"        Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="alpha_out1"    Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="theta_out1"    Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="phi_out1"      Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>

      <Signal Type="float" Name="x_out2"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="y_out2"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="z_out2"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="alpha_out2"    Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="theta_out2"    Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="phi_out2"      Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      </Packet>


    <Packet Name="PacketIn" LocalPort="2021" NetworkInterface="ETH0">
      <Signal Type="float" Name="x_in"        Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="y_in"        Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="z_in"        Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="alpha_in"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="theta_in"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="phi_in"      Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>

    <Signal Type="float" Name="x_in1"      Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="y_in1"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="z_in1"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="alpha_in1"  Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="theta_in1"  Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="phi_in1"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
  </Packet>

  </IOConfig>

我尝试了下面的代码片段,它在其余的 XML 中获取了 UnityObject 的所有值。

using UnityEngine;
using System.IO;
using System.Xml;
using System.Text; 
using System.Collections.Generic;
using System.Collections;

public class xmlreader : MonoBehaviour
{
    public static List<string> values; 
    public string gameObjects;

    public XmlReaderSettings settings;


    void Start ()
    {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreWhitespace = true;
            settings.IgnoreComments = true;
            values = new List<string>();
        using ( XmlReader reader = XmlReader.Create("D://Docs/Unity3D/cdp/UDPApplication/Components/UDPIOServer.xml", settings) ) {

        while ( reader.Read() ) {
                    if ( reader.NodeType == XmlNodeType.Element) {

                        if ( reader.HasAttributes ) {

                        if ( reader.GetAttribute("UnityObject") != null ) {
                            gameObjects = reader.GetAttribute("UnityObject");
                            values.Add(gameObjects);



                }
                                }
                            }


                            }
                        }



    }
                }

最佳答案

这可以用一个非常简单的 XPath 来完成表达式:

XmlDocument doc = new XmlDocument();
doc.Load("D://Docs/Unity3D/cdp/UDPApplication/Components/UDPIOServer.xml");

XmlNodeList nodes =
    doc.SelectNodes("IOConfig/Packet[@Name='PacketOut']/Signal/@UnityObject");

List<string> result = new List<string>();
foreach (XmlNode node in nodes)
{
    result.Add(node.Value);
}

result现在是 List<string>看起来像 {"CraneBoom", "CraneBoom", ...} .

此解决方案仅使用 System.Collections.GenericSystem.Xml .

关于c# - 如何反序列化 XML 中特定元素中属性的特定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13475206/

相关文章:

php - 易趣开发者改进

python - 如何在不覆盖结果的情况下抓取多个网页?

.net - .NET 中的速度和 XML 解析 - 序列化与 XML DOM 比较?

java - 使用 Java 从 XML 文件中提取值

c# - 如何在 C# 中使用 __doPostback

c# - 在遍历对象之前检查对象是否为空

c# - .NET 4.0 WPF,带行和列标题的 DataGrid

c# - ORA-01756 :quoted string not properly terminated Exception

android - Phonegap 全屏应用

java - 如何从Android的drawable文件夹中获取xml文件