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

Cannot get tag's text even if setting a NamespaceContext

我是 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>

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

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

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