嘿,我正在尝试查看是否可以读取XML文件,并且仅收集日期格式如YYYY-MM-DD的标记。


  这是一个在线示例:https://repl.it/repls/MedicalIgnorantEfficiency


这是我要解析的xml的示例:

<?xml version="1.0" encoding="UTF-8"?>
<ncc:Message xmlns:ncc="http://blank/1.0.6"
xmlns:cs="http://blank/1.0.0"
xmlns:jx="http://blank/1.0.0"
xmlns:jm="http://blank/1.0.0"
xmlns:n-p="http://blank/1.0.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://blank/1.0.6/person person.xsd">
    <ncc:DataSection>
        <ncc:PersonResponse>
            <!-- Message -->
            <cs:CText cs:type="No">NO WANT</cs:CText>
            <jm:CaseID>
                <!-- OEA -->
                <jm:ID>ABC123</jm:ID>
            </jm:CaseID>
            <jx:PersonName>
                <!-- NAM -->
                <jx:GivenName>Arugula</jx:GivenName>
                <jx:MiddleName>Pibb</jx:MiddleName>
                <jx:SurName>Atari</jx:SurName>
            </jx:PersonName>
            <!-- DOB -->
            <ncc:PersonBirthDateText>1948-05-11</ncc:PersonBirthDateText>
            <jx:PersonDetails>
                <!-- SXC -->
                <jx:PersonSSN>
                    <jx:ID/>
                </jx:PersonSSN>
            </jx:PersonDetails>
            <n-p:Activity>
                <!--DOZ-->
                <jx:ActivityDate>1996-04-04</jx:ActivityDate>
                <jx:HomeAgency xsi:type="cs:Organization">
                    <!-- ART -->
                    <jx:Organization>
                        <jx:ID>ZR5981034</jx:ID>
                    </jx:Organization>
                </jx:HomeAgency>
            </n-p:Activity>
            <jx:PersonName>
                <!-- DOB Newest -->
                <ncc:BirthDateText>1993-05-12</ncc:BirthDateText>
                <ncc:BirthDateText>1993-05-13</ncc:BirthDateText>
                <ncc:BirthDateText>1993-05-14</ncc:BirthDateText>
                <jx:IDDetails xsi:type="cs:IDDetails">
                    <!-- SMC Checker -->
                    <jx:SSNID>
                        <jx:ID/>
                    </jx:SSNID>
                </jx:IDDetails>
            </jx:PersonName>
        </ncc:PersonResponse>
    </ncc:DataSection>
</ncc:Message>


我想获取日期值和这些日期值上方的注释。因此,上面的示例xml如下所示:


  注释:(ncc:DataSection / ncc:PersonResponse)
  
  日期:1948-05-11(ncc:DataSection / ncc:PersonResponse / ncc:PersonBirthDateText)





  注释:(ncc:DataSection / ncc:PersonResponse / n-p:Activity)
  
  日期:1996-04-04(ncc:DataSection / ncc:PersonResponse / n-p:Activity / jx:ActivityDate)





  注释:(ncc:DataSection / ncc:PersonResponse / jx:PersonName)
  
  日期:

  1993-05-12 (ncc:DataSection/ncc:PersonResponse/jx:PersonName/ncc:BirthDateText)
  1993-05-13 (ncc:DataSection/ncc:PersonResponse/jx:PersonName/ncc:BirthDateText)
  1993-05-14 (ncc:DataSection/ncc:PersonResponse/jx:PersonName/ncc:BirthDateText)



我正在尝试使用的代码是:

public static void xpathNodes() throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
    File file = new File(base_);
    XPath xPath = XPathFactory.newInstance().newXPath();
    //String expression = "//*[not(*)]";
    String expression = "([0-9]{4})-([0-9]{2})-([0-9]{2})";
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    Document document = builder.parse(file);
    document.getDocumentElement().normalize();
    NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);

    for (int i = 0; i < nodeList.getLength(); i++) {
        System.out.println(getXPath(nodeList.item(i)));
    }
}

private static String getXPath(Node node) {
    Node parent = node.getParentNode();

    if (parent == null) {
        return node.getNodeName();
    }

    return getXPath(parent) + "/" + node.getNodeName();
}

public static void main(String[] args) throws Exception {
    xpathNodes();
}


我知道正则表达式(([[0-9] {4})-([0-9] {2})-([0-9] {2}))就像我在Notepad ++中使用的一样,它的工作原理可以在打开的xml文件中找到日期。

我目前收到错误消息:


  线程“主”中的异常javax.xml.transform.TransformerException:预期会找到位置路径,但遇到以下标记:[


这甚至还没有考虑到评论。

任何帮助将是巨大的!

最佳答案

您已向需要XPath表达式的API提供了Regex表达式。

您可以将正则表达式与XPath一起使用,但需要支持XPath 2.0或更高版本的处理器(例如Saxon)。 JDK附带的XPath处理器仍仅支持古老的XPath 1.0标准,而该标准不支持正则表达式。

您不能直接向xpath.compile()提供正则表达式,但可以提供//*[matches(., '--my regex--')]形式的XPath表达式。

如果您决定沿Saxon路线行驶,我建议您使用Saxon的内部树模型而不是DOM,因为它执行XPath的速度通常比DOM快五到十倍。

关于java - 仅解析XML获取注释和日期值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59737146/

10-12 02:54