【问题标题】:Reading data from XML with attributes从带有属性的 XML 中读取数据
【发布时间】:2014-10-08 10:38:16
【问题描述】:

我有一个如下所示的 XML 文件:

<CPageDataXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<control id="busRowOAppr2EIDLookUpUserControl" controltype="business">
    <field controlvaluetype="single" key="busRowOAppr2EIDLookUpUserControl_txtEID">
      <valuefield value="709227">E8 - John Doe</valuefield>
    </field>
    <field controlvaluetype="hidden_single" key="busRowOAppr2EIDLookUpUserControl_txtEID_Email">
      <valuefield value="_JohnDoe@Wonder.com">emailid</valuefield>
    </field>
</control>
<control id="busDelegationFromDate123" controltype="business">
    <field controlvaluetype="single" key="txtCalanderDateWithImage_UserControl">
      <valuefield value="" />
    </field>
</control>
</CPageDataXML>

我想读取 control id="busRowOAppr2EIDLookUpUserControl" 的 valuefield 的值

C# 代码是: 这是加载 XML 的代码:

XmlDocument xPagedata=new XmlDocument();
XmlNode xnodePagedata = null;
xPagedata.LoadXml(strPageData);

这是 SelectSingleNode 的代码:

string a = xnodePagedata.SelectSingleNode(//Control[@id='busRowOAppr2EIDLookUpUserControl']).Attributes["Value"].Value;

我尝试使用 SelectSingleNode(string) 但这给了我一个空引用异常。请建议我应该如何处理这个问题。我是 XML 的绝对初学者。

【问题讨论】:

  • 您使用什么来读取/解析 XML?你在使用 Linq-to-XML 吗?你关注你的xmlns了吗?请发布您到目前为止的代码。
  • 请展示您尝试过的内容 - 我个人建议使用 LINQ to XML...您根本不需要 XPath。
  • 我已经添加了代码。请看。
  • @JonSkeet 他不能使用System.XML.Linq 命名空间。你知道为什么吗?

标签: c# .net xml c#-4.0 xml-parsing


【解决方案1】:

使用相同方法的一种可能方式:

string a = 
    xnodePagedata.SelectSingleNode("//control[@id='busRowOAppr2EIDLookUpUserControl']/field/valuefield/@value")
                 .Value;

更新:

如果一个&lt;control&gt; 中有多个&lt;valuefield&gt;,并且您想要所有values,请使用SelectNodes(),例如:

var values =
    xPagedata.SelectNodes("//control[@id='busRowOAppr2EIDLookUpUserControl']/field/valuefield/@value");
foreach (XmlNode value in values)
{
    Console.WriteLine(value.Value);
}

【讨论】:

  • 第一个语句实际上对我有用。非常感谢。
【解决方案2】:

您可以使用XDocument:使用Descendants("control") 获取所有控件,然后使用Where 子句过滤它们,然后使用SelectMany 获取valuefield 值的扁平集合。

XDocument doc = XDocument.Load(filepath);

var result = doc.Descendants("control")
                .Where(i => (string)i.Attribute("id") == "busRowOAppr2EIDLookUpUserControl")
                .SelectMany(i => i.Descendants("valuefield")
                                  .Select(j => j.Attribute("value")))
                .ToList();

结果如下:

result  Count = 2    
[0] {value="709227"}    
[1] {value="_JohnDoe@Wonder.com"}

【讨论】:

  • 嗨。 XMLDocument 和 XDocument 是一样的吗?我已经使用 XMLDocument 来加载 XML。
  • 不,他们不是。它建议使用System.Xml.Linq.XDocument
  • 我在项目中添加了 System.XML.Linq 引用。但是当尝试在我的页面中使用该命名空间时,intellisense 不会显示 System.XML.Linq。
  • 你应该添加对System.XML.Linq.dll的引用
  • System.XML.dll 呢?
猜你喜欢
  • 2012-10-22
  • 2021-06-03
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多