即使设置NamespaceContext,也无法获取标记的文本

问题描述 投票:0回答:1

我是xpath的新手,我从未在java上处理过xml。我想从xml中获取值。标签可以在mgns1:之前或之前。所以我写了这段代码:

private List<String> parse(Node node, String file) throws XPathExpressionException {

    XPath xpath = XPathFactory.newInstance().newXPath();

    xpath.setNamespaceContext(new NamespaceContext() {

        public String getNamespaceURI(String prefix) {
            return prefix.equals("mgns1") ? "urn:edeveloper.Fournisseurs1031af" : null;
        }

        public Iterator<?> getPrefixes(String val) {
            return null;
        }

        public String getPrefix(String uri) {
            return null;
        }
    });

    Node node_codreg = (Node) xpath.evaluate("mgns1:CODREG", node, XPathConstants.NODE);

    ...

}

我尝试使用没有mgns1:的xml。但在运行时我没有ListNodes!那有什么不对?

编辑:

这是一个xml的例子:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Fournisseurs>

  <JournalExtract>2</JournalExtract>

  <Record>
    <STATUTRECORD>S</STATUTRECORD>
    <CODFOUR>148</CODFOUR>
    <RAISOC></RAISOC>
    <ADRFOUR></ADRFOUR>
    <CPVILLE></CPVILLE>
    <CODPAYS></CODPAYS>
    <TELEPHONE></TELEPHONE>
    <TELEX></TELEX>
    <FAX></FAX>
    <EMAIL></EMAIL>
    <SIRET></SIRET>
    <CONDPAIE></CONDPAIE>
    <MODPAIE></MODPAIE>
    <LIVR></LIVR>
    <REMISE>0.00</REMISE>
    <DEVISE></DEVISE>
    <CLASSE></CLASSE>
    <DELMOY>0.00</DELMOY>
    <TVAIC></TVAIC>
    <MOTCLE></MOTCLE>
    <DTEAGR>00/00/0000</DTEAGR>
    <CODREG></CODREG>
    <MTMINFAC>0.00</MTMINFAC>
    <MTMINFRANCO>0.00</MTMINFRANCO>
    <ZL01></ZL01>
    <ZL02></ZL02>
    <INDQUAL></INDQUAL>
    <CERTIF></CERTIF>
    <DTEVALMIN>00/00/0000</DTEVALMIN>
    <DTEVALMAX>00/00/0000</DTEVALMAX>
    <RAISOCREGL></RAISOCREGL>
    <ADRREGL></ADRREGL>
    <CPVILLEREGL></CPVILLEREGL>
    <PAYSREGL></PAYSREGL>
    <DOMBQE></DOMBQE>
    <CODEBQE></CODEBQE>
    <CODGUI></CODGUI>
    <COMPTE></COMPTE>
    <RIB></RIB>
    <TYPETVA></TYPETVA>
    <IBANPAYS></IBANPAYS>
    <IBANCLE>00</IBANCLE>
    <IBANCOMPTE></IBANCOMPTE>
    <CODEBIC></CODEBIC>
    <ROUTAGECDE></ROUTAGECDE>
    <ACHSYSFRTVA>false</ACHSYSFRTVA>
    <URL></URL>
    <REMINCPXNET>false</REMINCPXNET>
    <NOTMANSYST>false</NOTMANSYST>
    <PROSPECT>false</PROSPECT>
    <FOUPREF>false</FOUPREF>
    <FOUPPAL></FOUPPAL>
    <DTEMODTRI>00/00/0000</DTEMODTRI>
    <NUMDUNS></NUMDUNS>
    <CODLGFOU></CODLGFOU>
    <NOALIMAUTSF>false</NOALIMAUTSF>
    <AUTCDECH>false</AUTCDECH>
    <SEUILEPDIF>false</SEUILEPDIF>
    <MTMAXCDECH>0.00</MTMAXCDECH>
    <MTMAXCC>0.00</MTMAXCC>
    <MTMAXCCHCT>0.00</MTMAXCCHCT>
    <CP></CP>
    <VILLE></VILLE>
    <CPREGL></CPREGL>
    <VILREGL></VILREGL>
    <CAMINST>0.00</CAMINST>
    <CAMAXST>0.00</CAMAXST>
    <OCCASION>false</OCCASION>
    <ID_EXT></ID_EXT>
    <TAXE2></TAXE2>
    <TAXE3></TAXE3>
    <TAXE4></TAXE4>
    <DTECREDEM>00/00/0000</DTECREDEM>
    <BDC_ELEC>false</BDC_ELEC>
    <TYPE_FORM></TYPE_FORM>
    <FORMAT>0</FORMAT>
    <MODE_ENV></MODE_ENV>
    <MAIL_DEST></MAIL_DEST>
    <ADR_FTP></ADR_FTP>
    <USR_FTP></USR_FTP>
    <PWD_FTP></PWD_FTP>
    <PATH_DEP></PATH_DEP>
    <RECEPT_AUTO>false</RECEPT_AUTO>
    <PERIODICITE></PERIODICITE>
    <NOCCGEN>false</NOCCGEN>
  </Record>

</Fournisseurs>
java xpath xml-namespaces
1个回答
0
投票

您正在寻找名为mgns1:CODREG的元素,其中mgns1表示命名空间urn:edeveloper.Fournisseurs1031af

在您向我们展示的XML文档中,命名空间urn:edeveloper.Fournisseurs1031af中没有元素。那你为什么期望你的表达选择任何东西呢?

此外,你只是寻找所提供的node的直接孩子,你没有告诉我们这个节点是什么。也许你想要寻找所有的后代,而不仅仅是直接的孩子?

© www.soinside.com 2019 - 2024. All rights reserved.