【问题标题】:Java XML XPath Parser to C#Java XML XPath 解析器到 C#
【发布时间】: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);
}

【问题讨论】:

    标签: c# java xml parsing xpath


    【解决方案1】:

    下面的代码允许我保留我的 XPath 规则并仍然做我想做的事,而且从好的方面来说,它将值添加到字符串列表中——很好!

    XmlTextReader reader = new XmlTextReader(URL);
    
    XPathDocument doc = new XPathDocument(reader);
    XPathNavigator nav = doc.CreateNavigator();
    
    List<string> hourly = new List<string>();
    
    foreach(XPathNavigator node in (XPathNodeIterator) nav.Evaluate("/dwml/data/time-layout[3]/start-valid-time/text()"))
    {
        hourly.Add(node.Value);
    }
    

    【讨论】:

    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2013-11-25
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多