Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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 XPath访问具有特殊字符的名称的属性值_Java_Xml_Xpath - Fatal编程技术网

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