我正在尝试读取xml文件,例如:
<entry>
<title>FEED TITLE</title>
<id>5467sdad98787ad3149878sasda</id>
<tempi type="application/xml">
<conento xmlns="http://mydomainname.com/xsd/radiofeed.xsd" madeIn="USA" />
</tempi>
</entry>
这是我到目前为止的代码:
这是我尝试编写此代码的尝试,怎么说都不成功,这就是我开始赏金的原因。这是http://pastebin.com/huKP4KED。
赏金更新:
我确实真的尝试了好几天,但现在没想到会这么难,我会接受有用的链接/书籍/教程,但更喜欢代码,因为我昨天需要这样做。
这是我需要的:
关于上面的xml:
做这个的最好方式是什么 ?
编辑:
@帕斯卡尔·蒂文(Pascal Thivent)
也许创建方法将是一个好主意,例如public String getValue(String xml,Element
elementname),在其中指定标签名称,如果该值不可用,则该方法返回标签值或标签属性(也许将其名称作为附加方法参数)
如果标签值不可用,我真正想要获得的标签值或属性是什么,所以我正在考虑最好的方法是什么,因为我从未做过
最好的解决方案是使用XPath。您的pastebin已过期,但这是我收集的内容。假设我们有以下feed.xml
文件:
<?xml version="1.0" encoding="UTF-8" ?>
<entries>
<entry>
<title>FEED TITLE 1</title>
<id>id1</id>
<tempi type="type1">
<conento xmlns="dontcare?" madeIn="MadeIn1" />
</tempi>
</entry>
<entry>
<title>FEED TITLE 2</title>
<id>id2</id>
<tempi type="type2">
<conento xmlns="dontcare?" madeIn="MadeIn2" />
</tempi>
</entry>
<entry>
<id>id3</id>
</entry>
</entries>
这是一个简短但可编译且可运行的概念证明(feed.xml
文件位于同一目录中)。
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
public class XPathTest {
static class Entry {
final String title, id, origin, type;
Entry(String title, String id, String origin, String type) {
this.title = title;
this.id = id;
this.origin = origin;
this.type = type;
}
@Override public String toString() {
return String.format("%s:%s(%s)[%s]", id, title, origin, type);
}
}
final static XPath xpath = XPathFactory.newInstance().newXPath();
static String evalString(Node context, String path) throws XPathExpressionException {
return (String) html" target="_blank">xpath.evaluate(path, context, XPathConstants.STRING);
}
public static void main(String[] args) throws Exception {
File file = new File("feed.xml");
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
NodeList entriesNodeList = (NodeList) xpath.evaluate("//entry", document, XPathConstants.NODESET);
List<Entry> entries = new ArrayList<Entry>();
for (int i = 0; i < entriesNodeList.getLength(); i++) {
Node entryNode = entriesNodeList.item(i);
entries.add(new Entry(
evalString(entryNode, "title"),
evalString(entryNode, "id"),
evalString(entryNode, "tempi/conento/@madeIn"),
evalString(entryNode, "tempi/@type")
));
}
for (Entry entry : entries) {
System.out.println(entry);
}
}
}
这将产生以下输出:
id1:FEED TITLE 1(MadeIn1)[type1]
id2:FEED TITLE 2(MadeIn2)[type2]
id3:()[]
请注意,使用XPath如何使值检索变得非常简单,直观,易读和直接,并且“丢失”值也得到了很好的处理。
package javax.xml.xpath
我有一个像这样的xml结构 我需要选择ClassX节点,并在包含constname1(即variable1)AttAttribute的值中 这起作用了。但是,我需要做如下操作,而不是在循环中混合文本 这是我不对的 然而下面是正确的 但我希望将选择范围限制为classX的节点
嗨,下面是我的XML文件。 上面的XML文件包含父根作为打印,子节点作为一部分。我想在C#中读取子节点及其属性。若XML文件包含唯一的节点名,那个么我可以读取它们。但如果所有子节点都包含相同的节点名,那么我们如何读取它们呢。
如何能够基于另一个同级节点的属性选择节点属性?我想要实现的是从所有节点中提取链接(href值),这些节点后跟具有属性class=“body table news loss”的节点跨度,即选择器应该返回https://finance.yahoo.com/news/inspiremd-announces-planned-recapitalization-120000752.html在下面的示例中。我试
我想递归地连接一个节点的参数值和它的父节点的相同参数值。 例如,如下: 应该成为 我试过了 有什么问题吗?
这似乎是一个相当简单的问题,但我已经为此绞尽脑汁好几个小时了。我有一个类似于下面的节点结构: 我需要从子节点收集三种类型的属性:一种是字符串、布尔值和字符串数组。我认为下面的sql2查询可以工作并获得它们的属性,但无论出于什么原因,我都会得到一个错误: 查询 错误: 感谢您的帮助,因为我已经在这几天了。
我有一个XML: 我想向根元素:/doc添加一个属性(名称空间),以便输出如下所示: 我尝试了三种xslt(跳过了默认的“复制所有”部分以减少问题的长度)。 xslt1:见下文,问题在于将空名称空间xmlns=”“添加到/doc的所有子节点(即:/doc/tag1和/doc/tag2) Xslt2:见下文,问题是“ns”被添加到根节点:和 xslt3:请参见下文,问题是报告了错误:未定义名称空间前