Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 JAXB+;运动衫如何解组多个名称空间_Java_Xml_Namespaces_Jaxb_Xlink - Fatal编程技术网

Java JAXB+;运动衫如何解组多个名称空间

Java JAXB+;运动衫如何解组多个名称空间,java,xml,namespaces,jaxb,xlink,Java,Xml,Namespaces,Jaxb,Xlink,我在名称空间方面有问题。 我需要从公共api(Prestashop)中解包。 此api将xml作为xlink类型,如下所示: <prestashop xmlns:xlink="http://www.w3.org/1999/xlink"> <products> <product id="1" xlink:href="http://localhost:8080/prestashop/api/products/1"/> <product id="2" xlin

我在名称空间方面有问题。 我需要从公共api(Prestashop)中解包。 此api将xml作为xlink类型,如下所示:

<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<products>
<product id="1" xlink:href="http://localhost:8080/prestashop/api/products/1"/>
<product id="2" xlink:href="http://localhost:8080/prestashop/api/products/2"/>
</products>
</prestashop>

每种产品的api为:

<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<product>
<id>
<![CDATA[ 1 ]]>
</id>
<id_manufacturer xlink:href="http://localhost:8080/prestashop/api/manufacturers/1">
<![CDATA[ 1 ]]>
</id_manufacturer>
<id_supplier xlink:href="http://localhost:8080/prestashop/api/suppliers/1">
<![CDATA[ 1 ]]>
</id_supplier>
<id_category_default xlink:href="http://localhost:8080/prestashop/api/categories/3">
<![CDATA[ 3 ]]>
</id_category_default>
</product>
</prestashop>

我生成了两个包,其中包含每个XML的pojo类。 我想从产品列表中获取任何给定id的产品的属性

我有一个产品的名称空间在@XMLSchema中,但是这个名称空间对于一个路径是静态的。我知道这不是办法

下面是我的客户机类

public class ClientPrestashop{  

    public static final Logger log = Logger.getLogger(ClientPrestashop.class.getCanonicalName());
    private final String pass = "LA4DKY4AVJUODHCX0H0XH8E7EROV05J6";
    private final String url="http://LA4DKY4AVJUODHCX0H0XH8E7EROV05J6@localhost:8080/prestashop/api/";

    public Object getPrestashopPackageProducts(String path, Class<?> clase) throws JAXBException, Exception{

        ClientConfig config= new DefaultClientConfig();
        Client client = Client.create(config);
        client.addFilter(new HTTPBasicAuthFilter(pass, ""));

        WebResource webresource = client.resource(url + path);
        ClientResponse response = webresource.type(MediaType.APPLICATION_XML).get(ClientResponse.class);

        mostrar(response.getStatus());

        JAXBContext jaxbContext = JAXBContext.newInstance(clase);

        //Crear XMLFilter
        XMLFilter filter = new NamespaceFilter(url+path,true);

        //El XMLReader será encapsulado en nuestro XMLFilter.
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        filter.setParent(xr);

        //Modificar UnmarshalerHandler como ContentHandler en XMLFilter 
        Unmarshaller unmarshall = jaxbContext.createUnmarshaller();
        UnmarshallerHandler unmarshallerHandler = unmarshall.getUnmarshallerHandler();
        filter.setContentHandler(unmarshallerHandler);

        //Parse del XML
        InputSource sr = new InputSource(response.getEntityInputStream());
        filter.parse(sr);
        Object presta = unmarshallerHandler.getResult();

        return presta;
    }
public类ClientPrestashop{
public static final Logger log=Logger.getLogger(ClientPrestashop.class.getCanonicalName());
私有最终字符串传递=“LA4DKY4AVJUODHCX0H0XH8E7EROV05J6”;
私有最终字符串url=”http://LA4DKY4AVJUODHCX0H0XH8E7EROV05J6@localhost:8080/prestashop/api/“;
公共对象getPrestashopPackageProducts(字符串路径、类类别)抛出JAXBEException、Exception{
ClientConfig=newdefaultclientconfig();
Client=Client.create(config);
client.addFilter(新的HTTPBasicAuthFilter(通过“”);
WebResource=client.resource(url+path);
ClientResponse response=webresource.type(MediaType.APPLICATION_XML).get(ClientResponse.class);
mostrar(response.getStatus());
JAXBContext JAXBContext=JAXBContext.newInstance(clase);
//Crear滤波器
XMLFilter filter=newnamespacefilter(url+path,true);
//El XMLReader seráencapsulado en nuestro XMLFilter。
SAXParserFactory spf=SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
SAXParser sp=spf.newSAXParser();
XMLReader xr=sp.getXMLReader();
filter.setParent(xr);
//修改的解组器HALERHANDLER como ContentHandler en XMLFilter
Unmarshaller unmarshall=jaxbContext.createUnmarshaller();
UnmarshallerHandler UnmarshallerHandler=unmarshall.getUnmarshallerHandler();
setContentHandler(解组器Handler);
//解析del-XML
InputSource sr=新的InputSource(response.getEntityInputStream());
过滤解析(sr);
Object presta=unmarshallerHandler.getResult();
返回普雷斯塔;
}
这里有代码:


你能帮我吗?

你可以做以下事情:

@XmlAccessorType(XmlAccessType.FIELD)
public class Product {

    @XmlAttribute
    private int id;

    @XmlAttribute(namespace="http://www.w3.org/1999/xlink")
    private String href;
}
了解更多信息


我认为您可以在生成的package-info.java中调整预期的架构url。其中应该有一个注释。如果没有,您可以使用Castor,它对限定名限制不那么严格。谢谢您,Jamel Toms。我的包信息没有从给定的xml架构自动生成。我必须生成创建一个新包,然后填充以下代码
@XmlSchema(名称空间=”http://LA4DKY4AVJUODHCX0H0XH8E7EROV05J6@本地主机:8080/prestashop/api/products/1”)
elementFormDefault=XmlNsForm.QUALIFIED,。然后我用JAXB生成了POJO类。但是如果我想…/products/2,我需要更改它。如何获取所有名称空间?