www.91084.com

GVKun编程网logo

如何使用包含Java中名称空间的XPath检索XML数据?(使用什么命令可以查找包含java的所有软件包)

15

以上就是给各位分享如何使用包含Java中名称空间的XPath检索XML数据?,其中也会对使用什么命令可以查找包含java的所有软件包进行解释,同时本文还将给你拓展.net–带命名空间的XML的XPat

以上就是给各位分享如何使用包含Java中名称空间的XPath检索XML数据?,其中也会对使用什么命令可以查找包含java的所有软件包进行解释,同时本文还将给你拓展.net – 带命名空间的XML的XPath、c# – 如何序列化为控制名称空间的XML?、Java XPath:使用默认名称空间xmlns的查询、java – VTD-XML大数据xPathExpression不使用名称空间等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何使用包含Java中名称空间的XPath检索XML数据?(使用什么命令可以查找包含java的所有软件包)

如何使用包含Java中名称空间的XPath检索XML数据?(使用什么命令可以查找包含java的所有软件包)

我知道此页面中有很多此主题,但可悲的是,我仍然无法解决我的问题。

这是我的xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Request xmlns:ns1="http://www.sea.com">
<ns1:PayrollRequest>
  <ns1:PayrollCost>
    <ns1:PayrollID>123</ns1:PayrollID>
    <ns1:BatchID>7770</ns1:BatchID>
    <ns1:CompanyId>001</ns1:CompanyId>
    <ns1:GrossPay>60000</ns1:GrossPay>
  </ns1:PayrollCost>
</ns1:PayrollRequest>
</ns1:Request>

这是我在Java中的代码:

import org.w3c.dom.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import java.io.IOException;
import org.xml.sax.SAXException;

public class XPathTry {

public static void main(String[] args) 
throws ParserConfigurationException,SAXException,IOException,XPathExpressionException {

DocumentBuilderFactory domFactory = 
DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); 
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("SamplePayroll2.xml");
XPath xpath = XPathFactory.newInstance().newXPath();


// display all
XPathExpression expr = xpath.compile("//PayrollCost/*/text()");


Object result = expr.evaluate(doc,XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue()); 
   }
  }
}

是的,像往常一样,我无法获得输出,因为它仅显示:

Process exited with exit code 0.

仅当我删除ns:1时,才会显示输出,xml的代码将如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns:ns1="http://www.sea.com">
<PayrollRequest>
    <PayrollCost>
        <PayrollID>123</PayrollID>
        <BatchID>7770</BatchID>
        <CompanyId>001</CompanyId>
        <GrossPay>60000</GrossPay>
    </PayrollCost>
</PayrollRequest>
</Request>

问题是,我在网上发现的所有建议似乎都没有用:

例如,我已经尝试过

/*/namespace::*[name()='']

//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]

/*[local-name()=' ']/*[local-name()=' ']/*[local-name()=' ']

等2 ..

我能得到的唯一最好的输出是,它将显示:

null

谁能给我正确的代码给我解决我的问题?

提前致谢!

.net – 带命名空间的XML的XPath

.net – 带命名空间的XML的XPath

我有一个带有各种命名空间的xml,我想使用它来查询.SelectNodes(string xPath)

我注意到的问题是,只要我拥有所有这些名称空间,xPath查询就不会返回任何内容.

>无论如何要告诉XmlDocument.SelectNodes忽略这些名称空间,只是给我正确的元素(我查询的元素似乎没有名称空间前缀)?
>如果有,有谁可以请我提供一个如何做的例子?我在查询节点之前/当我应该定义什么?

谢谢您的帮助.

更正:我仍然无法确定问题所在.这是我的xml:

<Feed xmlns="http://www.w3.org/2005/Atom"  xmlns:openSearch="http://a9.com/-/spec/opensearchRSS/1.0/"  xmlns:gf="http://schemas.google.com/finance/2007"  
      xmlns:gd="http://schemas.google.com/g/2005" >
  <id>http://finance.google.com/finance/Feeds/xyx@google.com/portfolios</id>
  <updated>2009-12-15T19:32:21.000Z</updated>
  <category scheme="http://schemas.google.com/g/2005#kind"  term="http://schemas.google.com/finance/2007#portfolio" />
  <title type="text" >Portfolio Feed</title>
  <link rel="alternate"  type="text/html"  href="http://finance.google.com/finance/portfolio?action=view" />
  <link rel="http://schemas.google.com/g/2005#Feed"  type="application/atom+xml"  href="http://finance.google.com/finance/Feeds/default/portfolios" />
  <link rel="http://schemas.google.com/g/2005#post"  type="application/atom+xml"  href="http://finance.google.com/finance/Feeds/default/portfolios" />
  <link rel="self"  type="application/atom+xml"  href="http://finance.google.com/finance/Feeds/default/portfolios" />
  <openSearch:totalResults>24</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>24</openSearch:itemsPerPage>
  <entry>
    <id>http://finance.google.com/finance/Feeds/xyx@google.com/portfolios/2</id>
    <updated>2009-12-14T16:26:53.000Z</updated>
    <category scheme="http://schemas.google.com/g/2005#kind"  term="http://schemas.google.com/finance/2007#portfolio" />
    <title type="text" >Main</title>
    <link rel="self"  type="application/atom+xml"  href="http://finance.google.com/finance/Feeds/default/portfolios/2" />
    <link rel="edit"  type="application/atom+xml"  href="http://finance.google.com/finance/Feeds/default/portfolios/2" />
    <gd:FeedLink href="http://finance.google.com/finance/Feeds/xyx@google.com/portfolios/2/positions" />
    <gf:portfolioData currencyCode="USD"  gainPercentage="0.0"  return1w="0.0"  return1y="0.0"  return3m="0.0"  return3y="0.0"  return4w="0.0"  return5y="0.0"  returnOverall="0.0"  returnYTD="0.0" />
  </entry>
</Feed>

这是我的代码:

XmlDocument xml = ExecuteRequest(url);

var xmlnsManager = new System.Xml.XmlNamespaceManager(xml.NaMetable);
        xmlnsManager.AddNamespace("xmlns:openSearch","http://a9.com/-/spec/opensearchRSS/1.0/");
        xmlnsManager.AddNamespace("xmlns:gf","http://schemas.google.com/finance/2007");
        xmlnsManager.AddNamespace("xmlns:gd","http://schemas.google.com/g/2005");

        var nodes = xml.SelectNodes("//Feed/entry",xmlnsManager);

我的节点数仍为0!任何的想法?

您需要创建命名空间管理器,设置要使用的所有命名空间及其前缀,然后在XPath中,您需要使用前缀.
var doc = new XmlDocument(); 
doc.Load("myfile.xml");

var xmlnsManager = new System.Xml.XmlNamespaceManager(doc.NaMetable);
xmlnsManager.AddNamespace("ns","http://example.org/schema.xsd");

doc.SelectNodes("//ns:MyElement",xmlnsManager);

警告:我没有编译此代码.

c# – 如何序列化为控制名称空间的XML?

c# – 如何序列化为控制名称空间的XML?

我需要生成以下XML:

<Learner xmlns="some.domain.api">
  <ActivationDate>1999-05-31T11:20:00</ActivationDate>
  <EmailAddress>String content</EmailAddress>
  <ExpirationDate>1999-05-31T11:20:00</ExpirationDate>
  <FederalId>String content</FederalId>
  <FirstName>String content</FirstName>
  <Grade>K</Grade>
  <LastName>String content</LastName>
  <MiddleName>String content</MiddleName>
  <UserName>String content</UserName>
  <Password>String content</Password>
  <SISId>String content</SISId>
  <StateId>String content</StateId>
  <Status>Active</Status>
</Learner>

我读过这些问题:

> How can I make the xmlserializer only serialize plain xml?
> Automatically generate XSD to C# in Visual Studio IDE

我正在使用Xsd2Code从XSD生成类.那很有效.

我试过这个:

private static string SerializeXML(Object obj)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType(), "some.domain.api");

    //settings
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;

    StringWriter stream = new StringWriter();
    XmlWriter writer = XmlWriter.Create(stream, settings);

    serializer.Serialize(writer, obj);
    return stream.ToString();
}

但它产生了这个:

<Learner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="some.domain.api">
  <ActivationDate>1999-05-31T11:20:00</ActivationDate>
  <EmailAddress>String content</EmailAddress>
  <ExpirationDate>1999-05-31T11:20:00</ExpirationDate>
  <FederalId>String content</FederalId>
  <FirstName>String content</FirstName>
  <Grade>K</Grade>
  <LastName>String content</LastName>
  <MiddleName>String content</MiddleName>
  <UserName>String content</UserName>
  <Password>String content</Password>
  <SISId>String content</SISId>
  <StateId>String content</StateId>
  <Status>Active</Status>
</Learner>

我想摆脱xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns:xsd =“http://www.w3.org/2001/XMLSchema”.

如何?

更新

我也已经尝试过使用XmlSerializerNamespaces.如果我添加这样的名称空间,使用上面的实现进行必要的调整:

XmlSerializerNamespaces namespaces = 
    new XmlSerializerNamespaces(new[] { new XmlQualifiedname("ns","some.domain.api") });

我明白了:

<Learner xmlns:ns="some.domain.api">

但我需要这个:

<Learner xmlns="some.domain.api">

如果我添加这样的名称空间,使用上面的实现进行必要的调整:

XmlSerializerNamespaces namespaces = 
    new XmlSerializerNamespaces(new[] { XmlQualifiedname.Empty });

我明白了:

<q1:Learner xmlns:ns="some.domain.api">

对于所有XML标签!

我有什么方法可以获得我想要的输出?我真的不想使用StringBuilder来完成这项任务……

解决方法:

你可以像在那里那样做:

XmlSerializerNamespaces namespaces = 
new XmlSerializerNamespaces(new[] { new XmlQualifiedname("ns","some.domain.api") });

写完文件后执行以下操作:

StreamReader reader = new StreamReader(file_name);
string content = reader.ReadToEnd();
reader.Close();
content = Regex.Replace(content, ":ns", "");
StreamWriter writer = new StreamWriter(file_name);
writer.Write(content);
writer.Close();

不是最优雅,但它的工作原理.

Java XPath:使用默认名称空间xmlns的查询

Java XPath:使用默认名称空间xmlns的查询

我要对此文件执行XPath查询(显示的摘录):

<?xml version="1.0" encoding="UTF-8"?><!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST --><ModelClass xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.ModelClass:2.0">    <ModelClass.Parent>        <Core.Reference package="com.test.mypackage" name="ModelName" type="Model"/>

这是我正在使用的代码的摘要:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = domFactory.newDocumentBuilder();Document document = builder.parse(new File(testFile));XPathFactory factory = XPathFactory.newInstance();XPath xpath = factory.newXPath();xpath.setNamespaceContext( new NamespaceContext() {    public String getNamespaceURI(String prefix) {...String result = xpath.evaluate(xpathQueryString, document);System.out.println(result);

我面临的问题是,在XPath查询中引用默认名称空间时,不会调用getNamespaceURI方法来解决它。例如,此查询不提取任何内容:

//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package

现在,我尝试通过用xmlns假前缀替换来“诱骗”解析器d,然后相应地编写getNamespaceURI方法(以便http://xml.sap.com/2002/10/metamodel/webdynprod遇到问题时返回)。在这种情况下,将getNamespaceURI调用,但是XPath表达式求值的结果始终是一个空字符串。

如果我从文件和XPath查询表达式中删除名称空间,则可以获得所需的字符串(com.test.mypackage)。

有没有办法使默认名称空间正常工作?

答案1

小编典典

在您的Namespace上下文中,将您选择的前缀(例如df)绑定到文档中的名称空间URI

xpath.setNamespaceContext( new NamespaceContext() {    public String getNamespaceURI(String prefix) {      switch (prefix) {        case "df": return "http://xml.sap.com/2002/10/metamodel/webdynpro";        ...       }    });

然后在路径表达式中使用该前缀来限定元素名称,例如/df:ModelClass/df:ModelClass.Parent/df:Core.Reference[@type= ''Model'']/@package

java – VTD-XML大数据xPathExpression不使用名称空间

java – VTD-XML大数据xPathExpression不使用名称空间

在运行命名空间时,我有一个小的测试文件.如果我删除命名空间这两项工作我是否在使用巨大的代码做错了什么?

更改为删除不可行的代码

try {
        //without namespace works
        VTDGen vtdGen = new VTDGen();
        vtdGen.parseFile("test.xml",false);
        VTDNav vtdNav = vtdGen.getNav();
        Autopilot autopilot = new Autopilot(vtdNav);
        autopilot.selectXPath("//Receiver/Identifier");
        autopilot.evalXPath();
        System.out.println("Stand===>" + vtdNav.getXPathStringVal() + " ===>");
    } catch(indexoutofboundsexception e) {
        e.printstacktrace();
    }

    try {
        //with namespace doesn't work
        VTDGen vtdGen = new VTDGen();
        vtdGen.parseFile("test.xml",true);
        VTDNav vtdNav = vtdGen.getNav();
        Autopilot autopilot = new Autopilot(vtdNav);
        autopilot.declareXPathNameSpace("x","http://test/namespaces/ssfgf");
        autopilot.selectXPath("//x:Receiver/Identifier");
        int index = autopilot.evalXPath();
        System.out.println("Stand NS ===>" + vtdNav.toString(index) + " ===>");
    } catch(indexoutofboundsexception e) {
        e.printstacktrace();
    }

    try {
        //without namespace doesn't work
        VTDGenHuge vg = new VTDGenHuge();
        vg.parseFile("test.xml",false);
        VTDNavHuge vn = vg.getNav();
        AutopilotHuge ap = new AutopilotHuge(vn);
        ap.selectXPath("//Receiver/Identifier");
        ap.evalXPath();
        System.out.println("Huge ===> " + vn.toString(vn.getText()) + " ===>");
    } catch(indexoutofboundsexception e) {
        e.printstacktrace();
    }

    try {
        //with namespace doesn't work
        VTDGenHuge vg = new VTDGenHuge();
        vg.parseFile("test.xml",true);
        VTDNavHuge vn = vg.getNav();
        AutopilotHuge ap = new AutopilotHuge(vn);
        ap.declareXPathNameSpace("x","http://test/namespaces/ssfgf");
        ap.selectXPath("//Receiver/Identifier");
        ap.evalXPath();
        System.out.println("Huge NS ===> " + vn.toString(vn.getText()) + " ===>");
    } catch(indexoutofboundsexception e) {
        e.printstacktrace();
    }

我得到了巨大的代码和NS标准的java.lang.indexoutofboundsexception

这是一个样本XML,遗憾的是无法显示真正的xml

<x:TestDocument xmlns:x="http://test/namespaces/ssfgf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://test/namespaces/ssfgf">
    <x:TestHeader>
        <x:Type></x:Type>
        <x:Scopes>
            <x:Scope>
                <x:Identifier>Context</x:Identifier>
                <x:Type>CaseId</x:Type>
                <x:InstanceIdentifier>case1</x:InstanceIdentifier>
                <x:Business>
                    <x:Name>businessnane1</x:Name>
                </x:Business>
            </x:Scope>
            <x:Scope>
                <x:Identifier>Context</x:Identifier>
                <x:InstanceIdentifier>test1</x:InstanceIdentifier>
                <x:Type>TestId</x:Type>
            </x:Scope>
            <x:Scope>
                <x:Identifier>Context</x:Identifier>
                <x:InstanceIdentifier>other1</x:InstanceIdentifier>
                <x:Type>OtherId</x:Type>
            </x:Scope>
        </x:Scopes>
        <x:Receiver>
            <x:Identifier>testreceiverid</x:Identifier>
        </x:Receiver>
        <x:DocumentIdentification>
            <x:Type>type1</x:Type>
            <x:Identifier>id1</x:Identifier>
            <x:TypeVersion>version1</x:TypeVersion>
        </x:DocumentIdentification>
    </x:TestHeader>
    <x:TestBody attribute1="attribute1" attribute2="attribute2">
        <TestingData>testingdata1</TestingData>
    </x:TestBody>
</x:TestDocument>

解决方法

由于一些问题,您将获得异常:一些使用您的代码,另一些使用扩展的VTD-xml.

首先,你没有使用VTD的第二个代码片段来启用命名空间感知.

您也没有设置名称空间绑定权限..

ap.declareXPathNameSpace("x","http://test/namespaces/ssfgf");

第三,getText()返回-1,这导致异常.

最后,// test将不匹配任何节点…所以getText()肯定会返回-1.

今天关于如何使用包含Java中名称空间的XPath检索XML数据?使用什么命令可以查找包含java的所有软件包的介绍到此结束,谢谢您的阅读,有关.net – 带命名空间的XML的XPath、c# – 如何序列化为控制名称空间的XML?、Java XPath:使用默认名称空间xmlns的查询、java – VTD-XML大数据xPathExpression不使用名称空间等更多相关知识的信息可以在本站进行查询。

本文标签: