Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Java 正在分析XML,仅获取注释和日期值_Java_Regex_Xml_Xpath - Fatal编程技术网

Java 正在分析XML,仅获取注释和日期值

Java 正在分析XML,仅获取注释和日期值,java,regex,xml,xpath,Java,Regex,Xml,Xpath,嘿,我只是想看看我是否可以读取XML文件并只收集日期格式为YYYY-MM-DD的标记 以下是一个在线示例: 下面是要分析的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

嘿,我只是想看看我是否可以读取XML文件并只收集日期格式为YYYY-MM-DD的标记

以下是一个在线示例:

下面是要分析的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>
我尝试使用的代码是:

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();
}
public static void xpathNodes()抛出ParserConfiguration异常、SAXException、IOException、XPathExpressionException{
文件文件=新文件(基本文件);
XPath=XPathFactory.newInstance().newXPath();
//字符串表达式=“/*[非(*)]”;
字符串表达式=“([0-9]{4})-([0-9]{2})-([0-9]{2})”;
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder=builderFactory.newDocumentBuilder();
Document=builder.parse(文件);
document.getDocumentElement().normalize();
NodeList NodeList=(NodeList)xPath.compile(expression.evaluate(document,XPathConstants.NODESET);
for(int i=0;i
我知道正则表达式(([0-9]{4})-([0-9]{2})-([0-9]{2}))的工作原理与我在记事本+中使用的一样,它在那里可以很好地找到打开的xml文件中的日期

我当前收到错误信息:

线程“main”javax.xml.transform.TransformerException中出现异常:应为位置路径,但遇到以下标记:[

这甚至还没有考虑到评论


任何帮助都会很好!

您已经为需要XPath表达式的API提供了一个正则表达式

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

不能直接向
xpath.compile()
提供正则表达式,但可以提供形式为
/*[匹配(,'--my regex-->)]
的xpath表达式


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

您已经为需要XPath表达式的API提供了一个正则表达式

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

不能直接向
xpath.compile()
提供正则表达式,但可以提供形式为
/*[匹配(,'--my regex-->)]
的xpath表达式


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

对于不带正则表达式的XPath 1.0表达式,您最好使用:

//*[string-length()=10]
   [number(substring(.,1,4))=substring(.,1,4)]
   [substring(.,5,1)='-']
   [number(substring(.,6,2))=substring(.,6,2)]
   [substring(.,8,1)='-']
   [number(substring(.,9,2))=substring(.,9,2)]
|
//*[string-length()=10]
   [number(substring(.,1,4))=substring(.,1,4)]
   [substring(.,5,1)='-']
   [number(substring(.,6,2))=substring(.,6,2)]
   [substring(.,8,1)='-']
   [number(substring(.,9,2))=substring(.,9,2)]
   /preceding-sibling::node()[normalize-space()][1][self::comment()]
请注意:存在一些重复的表达式,因为您希望选择元素和注释节点。该表达式使用众所周知的惯用法进行数字测试。最后,因为在位置谓词
normalize-space()之前,无法保证解析器对仅空白文本节点的设置使用了
功能

测试


编辑:强制字符串长度。

对于不带正则表达式的XPath 1.0表达式,您最好使用:

//*[string-length()=10]
   [number(substring(.,1,4))=substring(.,1,4)]
   [substring(.,5,1)='-']
   [number(substring(.,6,2))=substring(.,6,2)]
   [substring(.,8,1)='-']
   [number(substring(.,9,2))=substring(.,9,2)]
|
//*[string-length()=10]
   [number(substring(.,1,4))=substring(.,1,4)]
   [substring(.,5,1)='-']
   [number(substring(.,6,2))=substring(.,6,2)]
   [substring(.,8,1)='-']
   [number(substring(.,9,2))=substring(.,9,2)]
   /preceding-sibling::node()[normalize-space()][1][self::comment()]
请注意:存在一些重复的表达式,因为您希望选择元素和注释节点。该表达式使用众所周知的惯用法进行数字测试。最后,因为在位置谓词
normalize-space()之前,无法保证解析器对仅空白文本节点的设置使用了
功能

测试


Edit:强制执行字符串长度。

RegExp自2.0版以来就是XPath的一部分。-此外,最好有格式良好的输入sample@Alejandro我将看看除了@Alejandro所评论的之外我还能做些什么,要知道即使使用XPath 2.0,正则表达式本身也不是XPath,但是您的代码正在调用
XPath.compile(表达式)
就好像它是一样。请参见
matches()
如果您使用的是XPath 2.0处理器,则在谓词中,或者如果您仅限于XPath 1.0,则采用XPath+Java正则表达式处理的两个阶段。@Alejandro正则表达式是XPath自2.0版以来的一部分。-此外,最好有格式良好的输入sample@Alejandro除了@Alejandro评论的内容,我会看看我能做些什么即使使用XPath 2.0,正则表达式本身也不是XPath,但是您的代码正在调用
XPath.compile(expression)
,就好像它是一样。请参见
matches()
如果您使用的是XPath 2.0处理器,则在谓词中,或者如果您仅限于XPath 1.0,则采用XPath+Java正则表达式处理的两个阶段。@Alejandro感谢回复@Alejandro,但从测试中我看不到我在Java代码中如何使用它?感谢回复@Alejandro,但从测试中我看不到我在我的代码中如何使用它java代码?