【发布时间】:2014-03-06 16:51:24
【问题描述】:
我目前正在将 Java 编写的 XML 解析器移植到 C#。 Java 中的解析器是我几个月前编写的(尽管由于我们的项目迁移到 C# 后现在基本上被放弃了),它通过 URL 解析 XML 数据,特别是 this(带有自定义 lat/long/time 参数)。
对于 Java 解析器,我选择了 XPath,因为数据有点……混乱。所以定义我的自定义路径而不是迭代和保存每个项目就是我所做的。
Java 中的代码 sn-p 我在移植时遇到了一些问题:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(someURLToXML.openStream());
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression hourly = xpath.compile("/dwml/data/time-layout[3]/start-valid-time/text()");
XPathExpression tempHourly = xpath.compile("/dwml/data/parameters/temperature[@type='hourly']/value/text()");
NodeList hourlyResult = (NodeList) hourly.evaluate(doc,XPathConstants.NODESET);
NodeList tempHourlyResult = (NodeList) tempHourly.evaluate(doc,XPathConstants.NODESET);
阅读一些关于 C# XPath 脚本的教程,我遇到了这个site。在另外谷歌搜索后,这似乎是在 C# 上执行 XPath 的事实上的方式。
到目前为止,我的 C# 骨架中有这个:
XmlTextReader reader = new XmlTextReader(URL);
XPathDocument doc = new XPathDocument(reader);
XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr;
expr = nav.Compile("/dwml/data/");
XPathNodeIterator iterator = nav.Select(expr);
while (iterator.MoveNext())
{
// do something
}
我所做的是我在expr 确定了我的默认表达式,但在那之后,我不太确定如何将我上面的XPaths 从Java 脚本移植到While 循环内,甚至如果我需要它,因为我的原始脚本根本没有使用任何循环,因为不需要对 XML 遍历进行硬编码。
我的问题是,如何移植这四行:
XPathExpression hourly = xpath.compile("/dwml/data/time-layout[3]/start-valid-time/text()");
XPathExpression tempHourly = xpath.compile("/dwml/data/parameters/temperature[@type='hourly']/value/text()");
NodeList hourlyResult = (NodeList) hourly.evaluate(doc,XPathConstants.NODESET);
NodeList tempHourlyResult = (NodeList) tempHourly.evaluate(doc,XPathConstants.NODESET);
转 C#?
编辑:
试试这个:
XmlTextReader reader = new XmlTextReader(URL);
XPathDocument doc = new XPathDocument(reader);
XPathNavigator nav = doc.CreateNavigator();
foreach(XPathNavigator node in (XPathNodeIterator) nav.Evaluate("/dwml/data/time-layout[3]/start-valid-time/text()"))
{
hourly.Add(node.Value);
}
【问题讨论】: