我有一种情况,XML文档包含类似于以下内容的东西,但是" Block"元素被更改了,在应用程序中,我通过使用GetElementsByTagName(" Amount")[0] .InnerText来访问in的值,因为它是第一次出现" Amount&#34 ;。那么"块"的顺序改变了,"金额"由GetElementsByTagName返回的仍然是第一次出现,但我想要" Amount"在" Block1"总是被退回。我如何在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>
C#:
XmlDocument doc = new XmlDocument();
doc.LoadXml(response);
string amount = doc.GetElementsByTagName("Amount")[0].InnerText;
答案 0 :(得分:2)
然而,在我的根元素中,我有
之类的东西<Response xmlns="testsite.com/schema/TestService/2015-01-01">
这是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;
答案 1 :(得分:0)
您可以使用方法session.query(Score).join(School).filter(School.SchoolName == 'RandomName')
和XPath表达式来访问所需的数据。您还需要使用命名空间管理器并导入正确的命名空间:
SelectSingleNode
无论Block1在哪里 - 第一,第二或第三个元素,这样的代码都会找到正确的值。方法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
返回与表达式匹配的第一个节点,因此如果XML中有多个Block1元素,那么结果可能不是您期望的结果
答案 2 :(得分:0)
从System.Xml.Linq开始;您需要加载xml文件,然后解析文档。例如,
var doc = XDocument.Load("file.xml");
IEnumerable<XElement> elements = doc.Descendants(tagNameHere);
如果你想创建这些后代的列表,你可以通过这样的方式访问这些元素:
List<string> myElements = new List<string>();
XElement element = elements.ElementAt(0);
myElements.Add(element.Value);
这只是为了让你入门。我建议你在这里阅读:
https://msdn.microsoft.com/en-us/library/system.xml.linq(v=vs.110).aspx