我必须解析一个如下所示的XML文档:
<?xml version="1.0" encoding="UTF-8" ?>
<m:OASISReport xmlns:m="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd">
<m:MessagePayload>
<m:RTO>
<m:name>CAISO</m:name>
<m:REPORT_ITEM>
<m:REPORT_HEADER>
<m:SYSTEM>OASIS</m:SYSTEM>
<m:TZ>PPT</m:TZ>
<m:REPORT>AS_RESULTS</m:REPORT>
<m:MKT_TYPE>HASP</m:MKT_TYPE>
<m:UOM>MW</m:UOM>
<m:INTERVAL>ENDING</m:INTERVAL>
<m:SEC_PER_INTERVAL>3600</m:SEC_PER_INTERVAL>
</m:REPORT_HEADER>
<m:REPORT_DATA>
<m:DATA_ITEM>NS_PROC_MW</m:DATA_ITEM>
<m:RESOURCE_NAME>AS_SP26_EXP</m:RESOURCE_NAME>
<m:OPR_DATE>2010-11-17</m:OPR_DATE>
<m:INTERVAL_NUM>1</m:INTERVAL_NUM>
<m:VALUE>0</m:VALUE>
</m:REPORT_DATA>
Run Code Online (Sandbox Code Playgroud)
问题是名称空间"http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"有时可能会有所不同.我想完全忽略它,只是从标记MessagePayload下游获取我的数据.
我到目前为止使用的代码是:
String[] namespaces = new String[1];
String[] namespaceAliases = new String[1];
namespaceAliases[0] = "ns0";
namespaces[0] = "http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd";
File inputFile = new File(inputFileName);
Map namespaceURIs = new HashMap();
// This query will return all of the ASR records.
String xPathExpression = "/ns0:OASISReport
/ns0:MessagePayload
/ns0:RTO
/ns0:REPORT_ITEM
/ns0:REPORT_DATA";
xPathExpression += "|/ns0:OASISReport
/ns0:MessagePayload …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的RSS阅读器中添加对stackoverflow提要的支持,但SelectNodes和SelectSingleNode没有任何效果.这可能与我还不了解的ATOM和xml命名空间有关.
我已经通过从feed标签中删除所有属性来实现它,但这是一个黑客,我想正确地做到这一点.那么,你如何使用带有原子馈送的SelectNodes?
这是一个饲料片段.
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:thr="http://purl.org/syndication/thread/1.0">
<title type="html">StackOverflow.com - Questions tagged: c</title>
<link rel="self" href="http://stackoverflow.com/feeds/tag/c" type="application/atom+xml" />
<subtitle>Check out the latest from StackOverflow.com</subtitle>
<updated>2008-08-24T12:25:30Z</updated>
<id>http://stackoverflow.com/feeds/tag/c</id>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
<entry>
<id>http://stackoverflow.com/questions/22901/what-is-the-best-way-to-communicate-with-a-sql-server</id>
<title type="html">What is the best way to communicate with a SQL server?</title>
<category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="c" /><category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="c++" /><category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="sql" /><category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="mysql" /><category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="database" />
<author><name>Ed</name></author>
<link rel="alternate" href="http://stackoverflow.com/questions/22901/what-is-the-best-way-to-communicate-with-a-sql-server" />
<published>2008-08-22T05:09:04Z</published>
<updated>2008-08-23T04:52:39Z</updated>
<summary type="html"><p>I am going to …Run Code Online (Sandbox Code Playgroud) 我可以获得以下任一xml:
<?xml version="1.0" encoding="UTF-8"?>
<dc:video xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>
A vid with Pete
</dc:title>
<dc:description>
Petes vid
</dc:description>
<dc:contributor>
Pete
</dc:contributor>
<dc:subject>
Cat 2
</dc:subject>
</dc:video>
Run Code Online (Sandbox Code Playgroud)
要么:
<?xml version="1.0" encoding="UTF-8"?>
<video>
<title>
A vid with Pete
<title>
<description>
Petes vid
<description>
<contributor>
Pete
<contributor>
<subject>
Cat 2
<subject>
</video>
Run Code Online (Sandbox Code Playgroud)
我试图访问一个元素:
string title = xmlDocFromOneLan.SelectSingleNode(@"/video/title").InnerXml;
Run Code Online (Sandbox Code Playgroud)
但是对于xml文档1,它由于命名空间而无法工作.
c#中有没有办法使用xpath忽略命名空间?我只是想选择我真的不关心命名空间的节点.(命名空间可以是DC DN或DCN等).
"/视频"
会读到:
<video></video>
or
<dc:video></video>
or
<dcn:video></video>
Run Code Online (Sandbox Code Playgroud) 我正在尝试以编程方式解析Atom提要.我将原子XML下载为字符串.我可以将XML加载到XmlDocument.但是,我无法使用XPath遍历文档.每当我尝试,我都会null.
我一直在使用这个Atom提要作为测试:http://steve-yegge.blogspot.com/feeds/posts/default
除了我使用" " 时,调用SelectSingleNode()总是返回.这是我现在正在尝试的:null/
using (WebClient wc = new WebClient())
{
string xml = wc.DownloadString("http://steve-yegge.blogspot.com/feeds/posts/default");
XmlNamespaceManager nsMngr = new XmlNamespaceManager(new NameTable());
nsMngr.AddNamespace(string.Empty, "http://www.w3.org/2005/Atom");
nsMngr.AddNamespace("app", "http://purl.org/atom/app#");
XmlDocument atom = new XmlDocument();
atom.LoadXml(xml);
XmlNode node = atom.SelectSingleNode("//entry/link/app:edited", nsMngr);
}
Run Code Online (Sandbox Code Playgroud)
我以为它可能是因为我的XPath,所以我也尝试了一个简单的根节点查询,因为我知道root应该工作:
// I've tried both with & without the nsMngr declared above
XmlNode node = atom.SelectSingleNode("/feed");
Run Code Online (Sandbox Code Playgroud)
无论我做什么,似乎都无法选择任何东西.显然我错过了一些东西,我只是无法弄清楚是什么.为了使XPath能够在这个Atom提要上工作,我需要做些什么?
虽然这个问题有答案,但我发现这个问题几乎完全重复:SelectNodes不能处理stackoverflow feed
我正在努力获得XPath表达式和命名空间规范的正确组合,这是package XML(argument namespaces)对于xmlns在顶部元素中定义了显式命名空间的XML文档所要求的.
感谢har07,我能够把它放在一起:
一旦查询名称空间,第一个条目ns还没有名称,这就是问题所在:
nsDefs <- xmlNamespaceDefinitions(doc)
ns <- structure(sapply(nsDefs, function(x) x$uri), names = names(nsDefs))
> ns
omegahat r
"http://something.org" "http://www.omegahat.org" "http://www.r-project.org"
Run Code Online (Sandbox Code Playgroud)
所以我们只需指定一个充当前缀的名称(这可以是任何有效的R名称):
names(ns)[1] <- "xmlns"
Run Code Online (Sandbox Code Playgroud)
现在,我们所要做的就是在XPath表达式中的任何地方使用默认名称空间前缀:
getNodeSet(doc, "/xmlns:doc//xmlns:b[@omegahat:status='foo']", ns)
Run Code Online (Sandbox Code Playgroud)
对于那些对基于name()和namespace-uri()(以及其他)的替代解决方案感兴趣的人可能会发现此帖有用.
仅仅是为了参考:在我们找到解决方案之前,这是试错代码:
考虑以下示例?xmlParse:
require("XML")
doc <- xmlParse(system.file("exampleData", "tagnames.xml", package = "XML"))
> doc
<?xml version="1.0"?>
<doc>
<!-- A comment -->
<a xmlns:omegahat="http://www.omegahat.org" xmlns:r="http://www.r-project.org">
<b>
<c>
<b/>
</c> …Run Code Online (Sandbox Code Playgroud) 我有以下XML文件:
<foo:a xmlns:foo=\"http://www.foo.com\">
<foo:b foo:bar=\"zar\">
</foo:b>
</foo:a>
Run Code Online (Sandbox Code Playgroud)
要获取具有值为"zar" 的属性栏的b节点(全部在正确的命名空间中),我可以使用XPath表达式:
/foo:a/foo:b[@foo:bar=\"zar\"]
Run Code Online (Sandbox Code Playgroud)
("foo"正确绑定到" http://www.foo.com " - 请参阅末尾的代码)
但是,当我想以命名空间不知道的方式做同样的事情时,虽然我可以通过依赖local-name()函数从元素中删除命名空间,但是我无法从属性中删除它们.
这是我能想到的最好的:
/*[local-name()='a']/*[local-name()='b' and @foo:bar=\"zar\"]
Run Code Online (Sandbox Code Playgroud)
(foo令人遗憾的是,用于限定bar属性的地方).
如何在完全删除命名空间的情况下编写上述表达式?
下面的代码已经在CLASSPATH上使用和不使用Saxon-HE-9.4.jar进行了测试并产生了正确的结果,但我无法从第二个XPath表达式中获取'foo'命名空间前缀!
import java.io.*;
import java.util.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import javax.xml.namespace.NamespaceContext;
public class FooMain {
public static void main(String args[]) throws Exception {
String xmlSample = "<foo:a xmlns:foo=\"http://www.foo.com\"><foo:b foo:bar=\"zar\"></foo:b></foo:a>";
XPath xpath = namespaceAwareXpath("foo", "http://www.foo.com");
{
System.out.printf("[NS-aware ] Number of 'b' nodes with foo:bar attribute …Run Code Online (Sandbox Code Playgroud)