如何在C#中解析嵌套的XML节点
本文关键字:嵌套 XML 节点 | 更新日期: 2023-09-27 17:58:19
我对C#很陌生,但这似乎应该是非常直接的。我正在尝试解析一个从web提要返回的XML字符串,它看起来像这样:
<autnresponse xmlns:autn="http://schemas.autonomy.com/aci/">
<action>QUERY</action>
<response>SUCCESS</response>
<responsedata>
<autn:numhits>6</autn:numhits>
<autn:hit>
<autn:reference>http://something.what.com/index.php?title=DPM</autn:reference>
<autn:id>548166</autn:id>
<autn:section>0</autn:section>
<autn:weight>87.44</autn:weight>
<autn:links>Castlmania,POUCH</autn:links>
<autn:database>Postgres</autn:database>
<autn:title>A Pouch and Mail - Castlmania</autn:title>
<autn:content>
<DOCUMENT>
<DRETITLE>Castlmania Pouch and Mail - Castlmania</DRETITLE>
<DRECONTENT>A paragraph of sorts that would contain content</DRECONTENT>
</DOCUMENT>
</autn:content>
</autn:hit>
<autn:hit>...</autn:hit>
<autn:hit>...</autn:hit>
<autn:hit>...</autn:hit>
<autn:hit>...</autn:hit>
</autnresponse>
运气不佳。我用这个代码开始:
XmlDocument xmlString = new XmlDocument();
xmlString.LoadXml(xmlUrl);
XmlElement root = xmlString.DocumentElement;
XmlNode GeneralInformationNode =
root.SelectSingleNode("//autnresponse/responsedata/autn:hit");
foreach (XmlNode node in GeneralInformationNode)
{
Console.Write("reference: "+node["autn:reference"]+" Title:"+node["DRETITLE"]+"<br />);
}
我想在每个autn:hit元素中打印的DRETITLE和autn:reference元素。用我的方法这样做可行吗?
我试着在好的旧网站上找了几个这样的例子,但都无济于事。
返回的错误是:
系统。Xml。XPath。XpathEception{NameSpace Manager或XsltContext需要…}
提前谢谢。
更新:
在尝试使用XmlNamespaceManager时,必须给它一个模式定义的url,如下所示:
XmlNamespaceManager namespmng = new XmlNamespaceManager (xmlString.NameTable);
namespmng.AddNamespace("autn","http://someURL.com/XMLschema");
问题似乎是,现在错误已经消失,但数据没有显示。我应该提到的是,我在一台没有互联网连接的机器上工作。另一件事是架构似乎不可用。我猜XmlNamespaceManager一旦能够连接到互联网就会工作,对吧?
使用System.Xml.Linq
可以是这样的:
var doc = XElement.Load(xmlUrl);
var ns = doc.GetNamespaceOfPrefix("autn");
foreach (var hit in doc.Descendants(ns + "hit"))
{
var reference = hit.Element(ns + "reference").Value;
var dretitle = hit.Descendants("DRETITLE").Single().Value;
WriteLine($"ref: {reference} title: {dretitle}");
}
首先,您得到的异常是因为您没有使用要解析的xml的XmlNamespaceManager
加载命名空间。类似这样的东西:
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xmlString.NameTable);
if (root.Attributes["xmlns:autn"] != null)
{
uri = root.Attributes["xmlns:autn"].Value;
namespaceManager.AddNamespace("autn", uri);
}
其次,你想做的事情是可能的。我建议使用root.SelectNodes(<your xpath here>)
,它将返回一个可以循环通过的autn:hit节点集合,而不是SelectSingleNode
,它将只返回一个节点。在其中,您可以深入到内容/DOCUMENT/DRITITLE,并使用XmlNode.Value
(如果您具体选择了文本)或使用DRETITLE节点上的XmlNode.InnerText
为DRETITLE节点提取文本。