【问题标题】:string.equals not working for mestring.equals 不适合我
【发布时间】:2012-12-07 15:02:28
【问题描述】:

这是代码的有用部分:

java.util.List<Element> elems = src.getAllElements();
Iterator it = elems.iterator();
Element el;
String key,value,date="",place="";
String [] data;
int k=0;
Segment content;
String contentstr;
String classname;

while(it.hasNext()){

    el = (Element)it.next();

    if(el.getName().equals("span"))
    {

            classname=el.getAttributeValue("class");
        if(classname.equals("edit_body"))
        {
            //java.util.List<Element> elemsinner = el.getChildElements();
            //Iterator itinner = elemsinner.iterator();


            content=el.getContent();

            contentstr=content.toString();


            if(true)
            {


                System.out.println("Done!");

                System.out.println(classname);

                System.out.println(contentstr);


            }
       }
    }

}

没有输出。但是,如果我删除 if(classname.equals("edit_body")) 条件,它会打印(在其中一次迭代中):

Done!
edit_body
&quot;I honestly think it is better to be a failure at something you love than to be a success at something you hate.&quot;

无法获取错误部分...求助!

我正在使用外部 java 库 BTW 进行 html 解析。

顺便说一句,输出开始时有两个错误,无论是否有 if 条件,这两种情况都存在。:

Dec 20, 2012 11:53:11 AM net.htmlparser.jericho.LoggerProviderJava$JavaLogger error SEVERE: EndTag br at (r1992,c60,p94048) not recognised as type '/normal' because its name and closing delimiter are separated by characters other than white space 

Dec 20, 2012 11:53:11 AM net.htmlparser.jericho.LoggerProviderJava$JavaLogger error SEVERE: Encountered possible EndTag at (r1992,c60,p94048) whose content does not match a registered EndTagType 

希望不会导致错误

好的,请有人给我解释一下! "edit_body".equals(el.getAttributeValue("class")) 工作!!

【问题讨论】:

  • 做一个System.out.println(el.getName())
  • 它应该是跨度
  • 在我们开始帮助之前,您的代码缺少关键部分。Does src.getAllElements();实际输出什么? Element#getName 的 API 是什么?假设 string 上的 equals 确实是错误的,你真的认为如果 String 上的 equals 方法不起作用,java 仍然存在。一般来说,当有人认为 java API 被破坏时,99.999% 的时间不是 java,而是他们自己的代码。
  • 好吧,当然src.getAllElements 会给出输出,因为如果我删除给定的if 条件,迭代器会完美工作.. getName() 为您提供字符串中标签的名称...jericho.htmlparser.net/docs/javadoc/index.html很明显,我不认为 equals 方法有问题或 JAVA API 已损坏,否则我不会寻求您的帮助。问题的标题是我能给出的最接近的短语!
  • 我从来没有遇到过这个问题,但尝试将两个字符串转换为相同的字符集? docs.oracle.com/javase/6/docs/api/java/lang/… 然后比较字节数组。

标签: java html string parsing compare


【解决方案1】:

我现在遇到了完全相同的问题。

我成功地使用了:SomeStringVar.replaceAll("\\P{Print}","");

此命令删除变体中的所有 Unicode 字符(您看不到的字符 - 字符串看起来相等,即使它们并不真正相等)。

我在均衡中需要的每个变体上都使用此命令,它也适用于我。

【讨论】:

  • 完美!这就是我现在缺少的代码...谢谢!
【解决方案2】:

您的 classname 中似乎有 leadingtrailing 空格

尝试使用这个:-

if(classname.trim().equals("edit_body"))

这将修剪末尾的任何空格。

【讨论】:

  • @Arkanath.. 你确定吗?尝试将您的System.out.println(classname); 替换为:-System.out.println("*" + classname + "*");,看看您会得到什么。当然首先删除if
  • 不幸的是,它变成了 edit_body !...由于 *s,edit_body 文本变成了斜体
  • @Arkanath.. 啊!对不起。 * 我想它是斜体的。将*替换为-,看看得到的输出是:-- edit_body -,带空格还是-edit_body-不带空格。
  • @Arkanath.. 好吧,现在这很奇怪。请显示使用您尝试解析的 HTML 部分。仅包含该文本的部分。
  • 顺便说一句,输出开头有两个错误,无论是否有if条件,这两种情况都存在。:Dec 20, 2012 11:53:11 AM net.htmlparser.jericho.LoggerProviderJava$JavaLogger error SEVERE: EndTag br at (r1992,c60,p94048) not recognised as type '/normal' because its name and closing delimiter are separated by characters other than white space Dec 20, 2012 11:53:11 AM net.htmlparser.jericho.LoggerProviderJava$JavaLogger error SEVERE: Encountered possible EndTag at (r1992,c60,p94048) whose content does not match a registered EndTagType希望不会导致错误
【解决方案3】:

首先,String.equals() 没有损坏。它适用于 数百万 其他程序/程序员。这不是您的问题的原因(除非您或某人故意修改...并破坏了您的 Java 安装...)

那么为什么两个明显相等的字符串比较不相等呢?

  1. 字符串上可能有前导或尾随空白字符。
  2. 可能嵌入了非打印字符。
  3. 当您使用典型字体显示它们时,可能有成对的 Unicode 字符看起来相同,但实际上并不相同。例如,希腊代码页包含看起来像拉丁元音的字符......但实际上是不同的代码,因此不相等。

【讨论】:

  • 我说 String.equals() 坏了吗??我说它不起作用,即不适合我!!不管怎样,你给我解释一下:"edit_body".equals(el.getAttributeValue("class"))工作!
  • 这听起来像是在我的场景 #3 中会发生什么。具体来说,不工作的代码版本在源代码中嵌入了“看起来像拉丁字母但不是”的字符之一。或者它可能在网页中(尽管这似乎不太可能,因为你的代码的新版本可以工作。)
  • 不工作 == 坏了。不为我工作!=不工作。毫无疑问,String.equals 方法完全按照指定的方式工作,并且您得到的结果与规范所说的完全一致。问题在于您使用它的方式。您只需要以调试问题的方式取证
  • 是的,这就是重点,新版本发生了什么?我的意思是它让我感到惊讶!
  • 请阅读我写的内容......我已经解释了(现在两次!!)似乎是根本原因。我不知道你是如何设法将“时髦”字符放入源代码的......
【解决方案4】:

将代码改为:

classname="edit_body"; //<- hardcode 

if(classname.equals("edit_body"))

如果代码现在进入if语句,那么在使用原来的"classname=el.getAttributeValue("class");"时,字符串内容肯定有一些不同。 在这种情况下,循环遍历各个字符并比较它们以找出差异。

如果代码仍然没有进入 if 语句,要么你的代码没有编译并且你正在运行旧代码,要么你的 java 安装被破坏了;-)

或。

如果 java 类似于 .net(我不知道 java) “el.getAttributeValue”是作为字符串输入的吗? 如果它被键入为对象,那么 if 语句将不会进入,因为它们是同一字符串的两个不同实例。

【讨论】:

    【解决方案5】:

    equals() 是 String 类的一个方法。因此,它适用于双引号。

     if(someString.equals("something")) ✓
     if(someString.equals('something')) ×
    

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 2011-01-05
      • 2011-12-23
      • 2012-04-01
      • 2011-05-02
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多