C#:如何通过值从Xml文件中选择单个节点(元素?)?

时间:2019-04-27 22:01:05

标签: c# xml selection

我是Xml的新手,它试图创建一个我可以从相应的C#控制台应用程序读取和写入的简单数据库。

我已加载Xml文件,然后生成Xml元素“ string_ID”的C#列表(希望将其作为每个节点中的标识符-将显示代码**注意:并非实际的Xml ID功能)。如果用户输入的内容与列表中的string_ID相匹配(我假设我可以剪切此部分,但这基本上是我的问题的核心),则程序将选择相应的Xml元素并增加count节点(?)。

根据用户的输入,我无法选择单个节点。好吧,我根本无法基于“ string_ID”进行单节点选择,就像硬编码测试值一样。

我之前在网上的一些尝试:

1) XmlElement root = xDoc.DocumentElement; var result = root.GetElementsByTagName("prizeUnit") .Where(i => (string)i.Element("string_ID") == "333AI") .Seelect(i => (string)i.Element("Folder"));

  • 我最近的一次;在哪里等都不注册。

2) XmlNode node = xDoc.DocumentElement.SelectSingleNode( '//prizeUnit/string_ID[text()="333AI"]');

  • 请注意单引号或双引号。

3) XmlNode node = xDoc.DocumentElement.SelectSingleNode( "root_prizes/prizeUnit/string_ID[" + input + "]");

4)  XmlNode node = xDoc.DocumentElement.SelectSingleNode( "root_prizes/prizeUnit/[string_ID/text() = \"input\"]");

  • 这是案例2之前的案例。 “ \”对我来说似乎值得注意。

我的Xml文件:


<root_prizes xmlns="http://tempuri.org/XMLSchema.xsd">
  <prizeUnit>
    <string_ID>333AI</string_ID>
    <prizeName>cashGrandPrize01</prizeName>
    <count>1313</count>
  </prizeUnit>
  <prizeUnit>
    <string_ID>334BI</string_ID>
    <prizeName>cashGrandPrize02</prizeName>
    <count>2424</count>
  </prizeUnit>
  <prizeUnit>
    <string_ID>335CI</string_ID>
    <prizeName>cashGrandPrize03</prizeName>
    <count>0</count>
  </prizeUnit>
</root_prizes>

我在上述文件中的架构(我只是跳入架构,如果其中存在明显问题,我深表歉意):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="root_prizes">
    <xs:complexType>
      <xs:sequence>
        <!--https://stackoverflow.com/questions/25409242/creating-an-xml-document-with-more-than-1-child-element-with-xml-schema-->
        <xs:element name="prizeUnit" maxOccurs="unbounded">
          <xs:complexType>
              <xs:sequence>
                <xs:element name="string_ID" type="xs:string" />
                <xs:element name="prizeName" type="xs:string" />
                <xs:element name="count" type="xs:integer" />
              </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

用户输入是应该与“ string_ID”相对应的字符串,即“ 335AI”。

对于情况3,我遇到了错误: 未处理的异常:System.Xml.XPath.XPathException:表达式必须计算为节点集。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

借助XPath docs,我已经成功为您构建了解决方案

conditionable

如果您有一个空的//if you have non-empty xmlns tag you have to use namespace manager XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("ps", "http://tempuri.org/XMLSchema.xsd"); string id = "334BI"; XmlNode node = doc.SelectSingleNode($"/ps:root_prizes/ps:prizeUnit[ps:string_ID='{id}']", nsmgr); //another of possible solutions //XmlNode node = doc.SelectSingleNode($"descendant::ps:prizeUnit[ps:string_ID='{id}']", nsmgr); 标记或根本没有任何标记,以下解决方案也将有效

xmlns