以上就是给各位分享如何使用包含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的所有软件包)
- .net – 带命名空间的XML的XPath
- c# – 如何序列化为控制名称空间的XML?
- Java XPath:使用默认名称空间xmlns的查询
- java – VTD-XML大数据xPathExpression不使用名称空间
如何使用包含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
我注意到的问题是,只要我拥有所有这些名称空间,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!任何的想法?
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?
我需要生成以下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的查询
我要对此文件执行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/webdynpro
在d
遇到问题时返回)。在这种情况下,将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不使用名称空间
更改为删除不可行的代码
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的第二个代码片段来启用命名空间感知.
您也没有设置名称空间绑定权限..
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不使用名称空间等更多相关知识的信息可以在本站进行查询。
本文标签: