Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析XML文件(Java)中特定标记的内容_Java_Xml_Xml Parsing_Sax - Fatal编程技术网

解析XML文件(Java)中特定标记的内容

解析XML文件(Java)中特定标记的内容,java,xml,xml-parsing,sax,Java,Xml,Xml Parsing,Sax,我有一个如下所示的XML文件,我需要使用Java生成一个.txt文件,其中包含标签中的纯文本,每一个文件一行 我读到我可以使用SAX来访问不同的标签,但是在这种情况下,在下面的示例中,在标签内部可能有随机标记,这是无效的 最好的方法是什么?也许是正则表达式 <?xml version="1.0" encoding="utf-8"?> [...] <source> <g id="_0"> <g id="_1">First valid se

我有一个如下所示的XML文件,我需要使用Java生成一个.txt文件,其中包含标签中的纯文本,每一个文件一行

我读到我可以使用SAX来访问不同的标签,但是在这种情况下,在下面的示例中,在标签内部可能有随机标记,这是无效的

最好的方法是什么?也许是正则表达式

<?xml version="1.0" encoding="utf-8"?>
[...]
<source>
  <g id="_0">
    <g id="_1">First valid sentence</g>
  </g>
</source>
<source>Another valid string</source>

您可以使用
joox
库解析
xml
数据。使用其
find()
方法,您可以获取所有
元素,然后使用
getTextContent()
提取其文本,如:

import java.io.File;
import java.io.IOException;
import org.xml.sax.SAXException;
import static org.joox.JOOX.$;

public class Main {

    public static void main(String[] args) throws SAXException, IOException {
        $(new File(args[0]))
            .find("source")
            .forEach(elem -> System.out.println(elem.getTextContent().trim()));

    }
}
我将假设一个格式良好的
xml
文件,如:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <source>
        <g id="_0">
            <g id="_1">First valid sentence</g>
        </g>
    </source>
    <source>Another valid string</source>
</root>

编辑。对不起,我没有读随机标签部分。我会把整个文档看作一个字符串,并尝试先提取“随机”标签标识符。在SAX中,你只需等待你的开始标签,打开一个标志,然后收集你看到的所有字符,直到你看到结束标签。只需忽略内部标记的开始和结束事件。@JPMoresmau因此,在您的解决方案中,我仍然需要使用regex来丢弃标记(上面的示例),如果存在的话。对吗?将整个XML视为字符串并应用ReXEX会不会更容易,因为慢鳟鱼建议?好吧,不,SAX事件会告诉你“我启动源标签”,这就是你开始收集文本的提示。然后,您将得到一个SAX事件,它告诉您“我正在启动一个g标记”,这不会改变任何事情。然后,当您得到一些您收集的文本时,直到您看到事件“close tag source”,您停止收集文本。
<?xml version="1.0" encoding="utf-8"?>
<root>
    <source>
        <g id="_0">
            <g id="_1">First valid sentence</g>
        </g>
    </source>
    <source>Another valid string</source>
</root>
First valid sentence
Another valid string