Java XPath访问具有特殊字符的名称的属性值
我试图访问属性值,但属性名称有特殊字符,例如:Java XPath访问具有特殊字符的名称的属性值,java,xml,xpath,Java,Xml,Xpath,我试图访问属性值,但属性名称有特殊字符,例如: <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <row> <ELEMENT1 at:it="true">W</ELEMENT1>------ <ELEMENT2>IN</ELEMENT2> <ELEMENT3>RP</ELEMENT3> <
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<ELEMENT1 at:it="true">W</ELEMENT1>------
<ELEMENT2>IN</ELEMENT2>
<ELEMENT3>RP</ELEMENT3>
<ELEMENT4>KKK</ELEMENT4>
</row>
<row>
<ELEMENT1 acón='sys'>2</ELEMENT1>------
<ELEMENT2>ARQ</ELEMENT2>
<ELEMENT3>MR</ELEMENT3>
<ELEMENT4>AC</ELEMENT4>
</row>
<row>
<ELEMENT1>3</ELEMENT1>
<ELEMENT2>I</ELEMENT2>
<ELEMENT3 at:it="true" >RP</ELEMENT3>------
<ELEMENT4>KKK</ELEMENT4>
</row>
<row>
<ELEMENT1>1</ELEMENT1>
<ELEMENT2>CC</ELEMENT2>
<ELEMENT3>XX</ELEMENT3>
<ELEMENT4 eléct='false' >I</ELEMENT4>------
</row>
<row>
<ELEMENT1>12</ELEMENT1>
<ELEMENT2 at:it="true" >IN</ELEMENT2>------
<ELEMENT3>3</ELEMENT3>
<ELEMENT4></ELEMENT4>
</row>
</root>
但是带有特殊字符的属性名我无法使用XPath查询表达式访问它们
如何将XML文件访问到具有特殊字符名称的属性值
为了将XML文件转换为DOM,我使用了Java6、javax.XML、org.w3c.DOM。意识到冒号(:
)仅在名称空间前缀的一部分出现以下情况时才用于元素或属性名:
注意:
XML建议中的名称空间赋予
包含冒号字符的名称。因此,作者不应使用
XML名称中的冒号(命名空间除外),但XML
处理器必须接受冒号作为名称字符
所以
如果您通过在XML中的名称空间前缀处定义来更改XML,则可以选择“true”
如果您的XPath处理器支持UTF-8编码(而且应该支持),则将毫无问题地选择“sys”
将选择类似的
“false”
。我用Java 6尝试了它,在访问带有重音符号的属性时没有问题。冒号是一种特殊情况,因为它用于用名称空间前缀表示元素/属性名称。XML不使用名称空间,否则在处有前缀的名称空间声明
XML解析器有一个开关,可以将冒号作为名称的一部分,但XPath引擎始终具有名称空间意识。但只要耍点小把戏,这也是可能的:
File xmlFile = new File("in.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Parse without namespaces. Otherwise parsing leads to an error
// because there is no namespace declaration for prefix 'at'.
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr1 = xpath.compile("/root/row/ELEMENT1/@acón");
//XPathExpression expr2 = xpath.compile("/root/row/ELEMENT1/@at:it"); Doesn't work!
XPathExpression expr2 = xpath.compile("/root/row/ELEMENT1/@*[name() = 'at:it']");
XPathExpression expr3 = xpath.compile("/root/row/ELEMENT4/@eléct");
System.out.println((String) expr1.evaluate(doc, XPathConstants.STRING));
System.out.println((String) expr2.evaluate(doc, XPathConstants.STRING));
System.out.println((String) expr3.evaluate(doc, XPathConstants.STRING));
输出为:
sys
true
false
安吉尔,欢迎来到Stack Overflow。你来这里几个月了,问了9个问题,但还没有找到答案。请阅读链接页面,并考虑帮助和/或支持你的答案。谢谢…谢谢,谢谢,我试过。。。factory.setNamespaceAware(false);。。。。但还是不行谢谢,我试过。。。factory.setNamespaceAware(false)。。。但它仍然不能很好地工作。。。我也试过。。。factory.setNamespaceAware(true)。。。和xsi:它。。但不起作用。我将继续测试。正如所述,您确实不应该在元素或属性名称中使用冒号,除非它是名称空间前缀的一部分。虽然从技术上讲,规范允许这样做,但听到你遇到麻烦我并不感到惊讶。真的,就是别这么做。
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:at="http://example.com/at">
<row>
<ELEMENT1 at:it="true">W</ELEMENT1>------
<ELEMENT2>IN</ELEMENT2>
<ELEMENT3>RP</ELEMENT3>
<ELEMENT4>KKK</ELEMENT4>
</row>
<row>
<ELEMENT1 acón='sys'>2</ELEMENT1>------
<ELEMENT2>ARQ</ELEMENT2>
<ELEMENT3>MR</ELEMENT3>
<ELEMENT4>AC</ELEMENT4>
</row>
<row>
<ELEMENT1>3</ELEMENT1>
<ELEMENT2>I</ELEMENT2>
<ELEMENT3 at:it="true" >RP</ELEMENT3>------
<ELEMENT4>KKK</ELEMENT4>
</row>
<row>
<ELEMENT1>1</ELEMENT1>
<ELEMENT2>CC</ELEMENT2>
<ELEMENT3>XX</ELEMENT3>
<ELEMENT4 eléct='false' >I</ELEMENT4>------
</row>
<row>
<ELEMENT1>12</ELEMENT1>
<ELEMENT2 at:it="true" >IN</ELEMENT2>------
<ELEMENT3>3</ELEMENT3>
<ELEMENT4></ELEMENT4>
</row>
</root>
/root/row/ELEMENT1/@acón
/root/row/ELEMENT4/@eléct
File xmlFile = new File("in.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Parse without namespaces. Otherwise parsing leads to an error
// because there is no namespace declaration for prefix 'at'.
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr1 = xpath.compile("/root/row/ELEMENT1/@acón");
//XPathExpression expr2 = xpath.compile("/root/row/ELEMENT1/@at:it"); Doesn't work!
XPathExpression expr2 = xpath.compile("/root/row/ELEMENT1/@*[name() = 'at:it']");
XPathExpression expr3 = xpath.compile("/root/row/ELEMENT4/@eléct");
System.out.println((String) expr1.evaluate(doc, XPathConstants.STRING));
System.out.println((String) expr2.evaluate(doc, XPathConstants.STRING));
System.out.println((String) expr3.evaluate(doc, XPathConstants.STRING));
sys
true
false