C# 如何使用XPath从根标记获取所有不同的元素标记
我有一个如下的xml文件C# 如何使用XPath从根标记获取所有不同的元素标记,c#,xpath,xpathnavigator,C#,Xpath,Xpathnavigator,我有一个如下的xml文件 <root> <element1> <header>header1</header> <tag1>tag1</tag1> <response> <status>success</status> <Data> <id>d1</id> <tes
<root>
<element1>
<header>header1</header>
<tag1>tag1</tag1>
<response>
<status>success</status>
<Data>
<id>d1</id>
<test>2</test>
</Data>
<Beta>
<betaid>sdsd</betaid>
<code>123</code>
<code>ddd</code>
</Beta>
</response>
</element1>
</root>
我的问题:如何获得“Response”标记下的第一个子元素?i、 e staus、数据和测试版。
在C#中使用XPath。多谢各位
我的.net代码在这里,但它不起作用
XPathDocument doc= new XPathDocument(XmlReaderdata);
XPathNavigator mes, Nav = doc.CreateNavigator();
foreach(XPathNavigator node in (XPathNodeIterator)Nav.Evaluate("//response/*)
{
node.Name;
}
类似这样的XPath查询应该可以工作:
//response/*
例如:
var xml = @"<root> ... </root>";
using (StringReader stream = new StringReader(xml))
{
XPathDocument doc= new XPathDocument(stream);
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator itor = (XPathNodeIterator)nav.Evaluate("//response/*");
foreach(XPathNavigator node in itor)
{
Console.WriteLine(node.Name);
}
}
您可以使用
//response
:
DTO:
公共类响应
{
公众回应(
{
数据=新列表();
Beta=新列表();
}
公共字符串状态{get;set;}
公共列表数据{get;set;}
公共列表Beta{get;set;}
}
代码:
var document=XDocument.Parse(数据);
var element=document.XPathSelectElement(“//响应”);
var响应=新响应();
response.Status=element.element(“Status”).Value;
foreach(element.element(“数据”).Elements()中的var-dataElement)
{
Add(新的KeyValuePair(dataElement.Name.LocalName,dataElement.Value));
}
foreach(element.element(“Beta”).Elements()中的变量betaElement)
{
Add(新的KeyValuePair(betaElement.Name.LocalName,betaElement.Value));
}
编辑:部分加载
public Response ParseResponse(XPathDocument document)
{
var navigator = document.CreateNavigator();
var iterator = navigator.Select("//response");
iterator.MoveNext();
var responseDoc = XDocument.Parse(iterator.Current.OuterXml);
var element = responseDoc.Element("response");
var response = new Response();
response.Status = element.Element("status").Value;
foreach(var dataElement in element.Element("Data").Elements())
{
response.Data.Add(new KeyValuePair<string, string>(dataElement.Name.LocalName, dataElement.Value));
}
foreach(var betaElement in element.Element("Beta").Elements())
{
response.Beta.Add(new KeyValuePair<string, string>(betaElement.Name.LocalName, betaElement.Value));
}
return response;
}
Response response;
using(var reader = XmlReader.Create(stream))
{
var doc = new XPathDocument(reader);
response = ParseResponse(doc);
}
公共响应解析响应(XPathDocument文档)
{
var navigator=document.CreateNavigator();
var iterator=navigator.Select(“//响应”);
iterator.MoveNext();
var responseDoc=XDocument.Parse(iterator.Current.OuterXml);
var元素=响应DC.元素(“响应”);
var响应=新响应();
response.Status=element.element(“Status”).Value;
foreach(element.element(“数据”).Elements()中的var-dataElement)
{
Add(新的KeyValuePair(dataElement.Name.LocalName,dataElement.Value));
}
foreach(element.element(“Beta”).Elements()中的变量betaElement)
{
Add(新的KeyValuePair(betaElement.Name.LocalName,betaElement.Value));
}
返回响应;
}
反应;
使用(var reader=XmlReader.Create(stream))
{
var doc=新的XPathDocument(读卡器);
响应=解析响应(doc);
}
是否正在尝试获取子节点的名称?
我希望这会有所帮助
string xmlstring = "<root><element><response><status>Success</status><Data><id>1</id></Data></response></element></root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlstring);
XmlNode node = doc.SelectSingleNode("/root/element/response");
XmlNodeList children = node.ChildNodes;
foreach(XmlNode i in children )
Console.WriteLine(i.Name);
string xmlstring=“Success1”;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xmlstring);
XmlNode node=doc.SelectSingleNode(“/root/element/response”);
XmlNodeList children=node.ChildNodes;
foreach(子节点中的XmlNode i)
控制台写入线(即名称);
谢谢。我试过了,但没用。这是我的code@hss我提供了一个工作代码的示例。请看我的最新答案。谢谢。这是LinqTOXML。它们是使用XPathDocument实现这一点的一种方法吗?由于我的文件很大,我不想将整个xml数据加载到内存中。添加了一些代码来加载正在传输的部分文档。
var document = XDocument.Parse(data);
var element = document.XPathSelectElement("//response");
var response = new Response();
response.Status = element.Element("status").Value;
foreach(var dataElement in element.Element("Data").Elements())
{
response.Data.Add(new KeyValuePair<string, string>(dataElement.Name.LocalName, dataElement.Value));
}
foreach(var betaElement in element.Element("Beta").Elements())
{
response.Beta.Add(new KeyValuePair<string, string>(betaElement.Name.LocalName, betaElement.Value));
}
public Response ParseResponse(XPathDocument document)
{
var navigator = document.CreateNavigator();
var iterator = navigator.Select("//response");
iterator.MoveNext();
var responseDoc = XDocument.Parse(iterator.Current.OuterXml);
var element = responseDoc.Element("response");
var response = new Response();
response.Status = element.Element("status").Value;
foreach(var dataElement in element.Element("Data").Elements())
{
response.Data.Add(new KeyValuePair<string, string>(dataElement.Name.LocalName, dataElement.Value));
}
foreach(var betaElement in element.Element("Beta").Elements())
{
response.Beta.Add(new KeyValuePair<string, string>(betaElement.Name.LocalName, betaElement.Value));
}
return response;
}
Response response;
using(var reader = XmlReader.Create(stream))
{
var doc = new XPathDocument(reader);
response = ParseResponse(doc);
}
string xmlstring = "<root><element><response><status>Success</status><Data><id>1</id></Data></response></element></root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlstring);
XmlNode node = doc.SelectSingleNode("/root/element/response");
XmlNodeList children = node.ChildNodes;
foreach(XmlNode i in children )
Console.WriteLine(i.Name);