Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C通过XML文档的名称访问子节点#_C#_Xml - Fatal编程技术网

C# 使用C通过XML文档的名称访问子节点#

C# 使用C通过XML文档的名称访问子节点#,c#,xml,C#,Xml,我遇到过这样一种情况:XML文档包含类似于以下内容的内容,但随后“Block”元素的顺序发生了更改,并且在应用程序中,我使用GetElementsByTagName(“Amount”)[0].InnerText访问in的值,因为它是“Amount”的第一次出现。然后“Blocks”的顺序改变了,GetElementsByTagName返回的“Amount”仍然是第一次出现,但是我希望“Block1”中的“Amount”总是被返回。我如何在C#中实现这一点 之前: <Response xml

我遇到过这样一种情况:XML文档包含类似于以下内容的内容,但随后“Block”元素的顺序发生了更改,并且在应用程序中,我使用GetElementsByTagName(“Amount”)[0].InnerText访问in的值,因为它是“Amount”的第一次出现。然后“Blocks”的顺序改变了,GetElementsByTagName返回的“Amount”仍然是第一次出现,但是我希望“Block1”中的“Amount”总是被返回。我如何在C#中实现这一点

之前:

<Response xmlns="testsite.com/schema/TestService/2015-01-01">
  <Block1>
     <Amount>$5.00</Amount>
  </Block1>
  <Block2>
     <Amount>$0.00</Amount>
  </Block2>
  <Block3>
     <Amount>$0.00</Amount>
  </Block3>
</Response>
<Response xmlns="testsite.com/schema/TestService/2015-01-01">
  <Block2>
     <Amount>$0.00</Amount>
  </Block2>
  <Block3>
     <Amount>$0.00</Amount>
  </Block3>
  <Block1>
     <Amount>$5.00</Amount>
  </Block1>
</Response>

您可以使用方法
SelectSingleNode
和XPath表达式来访问所需的数据。您还需要使用命名空间管理器并导入正确的命名空间:

var namespaceManager= new XmlNamespaceManager(doc.NameTable);
namespaceManager.AddNamespace("a", "testsite.com/schema/TestService/2015-01-01");

var xmlNode = doc.SelectSingleNode("/a:Response/a:Block1/a:Amount", namespaceManager);
var value = node.InnerText;    // prints $5.00

无论Block1是第一个、第二个还是第三个元素,这样的代码都会找到正确的值。方法
SelectSingleNode
返回与表达式匹配的第一个节点,因此,如果XML中有多个Block1元素,则结果可能不是您期望的结果

从System.XML.Linq开始;您需要加载xml文件,然后解析文档。比如说,

var doc = XDocument.Load("file.xml");
IEnumerable<XElement> elements = doc.Descendants(tagNameHere);
var doc=XDocument.Load(“file.xml”);
IEnumerable elements=doc.subjects(tagNameHere);
如果要创建这些子体的列表,可以通过执行以下操作来访问这些元素:

List<string> myElements = new List<string>();
XElement element = elements.ElementAt(0);
myElements.Add(element.Value);
List myElements=new List();
XElement元素=元素。元素位于(0);
添加(element.Value);
这只是为了让你开始。我建议你在这里阅读:

但是,在我的根元素中有类似于

它是xml的默认xmlnamespece。使用您提供的新信息

XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("ns", "testsite.com/schema/TestService/2015-01-01");

var value = doc.SelectSingleNode("/ns:Response/ns:Block1/ns:Amount", mgr).InnerText;

这正是我要寻找的…但是,在我的根元素中,我有一些类似于和引用值的东西,它给了我一个空引用异常,即使在我转义引用之后…请查看我更新的原始帖子。看起来你更新了我们的答案…这100%有效,非常感谢。kyle,我在你的新要求中添加了一个答案。非常感谢,这就是我要找的。你对此有什么建议吗?
XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("ns", "testsite.com/schema/TestService/2015-01-01");

var value = doc.SelectSingleNode("/ns:Response/ns:Block1/ns:Amount", mgr).InnerText;