Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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
如果以<;开头,Android Html.fromHtml()将丢失Html;p>;标签_Android_Android Xml_Android Pullparser - Fatal编程技术网

如果以<;开头,Android Html.fromHtml()将丢失Html;p>;标签

如果以<;开头,Android Html.fromHtml()将丢失Html;p>;标签,android,android-xml,android-pullparser,Android,Android Xml,Android Pullparser,我调用一个web服务,它返回一些包含在XML信封中的HTML。。。比如: <xml version="1.0" cache="false"> <text color="white"> <p> Some text <br /> <p> </text> </xml> 这很好,即使包含一些html标记,也可以在元素中获取文本或html 当元素的数据以标记开头时,就会出现问题,如上例所示

我调用一个web服务,它返回一些包含在XML信封中的HTML。。。比如:

<xml version="1.0" cache="false">
    <text color="white">
        <p> Some text <br /> <p>
    </text>
</xml>
这很好,即使包含一些html标记,也可以在元素中获取文本或html

元素的数据以标记开头时,就会出现问题,如上例所示。在这种情况下,数据丢失,文本为空

我如何解决这个问题

编辑

感谢您指出我的服务的响应实际上不是有效的XML&元素没有正确关闭。但我无法控制服务,因此无法编辑返回的内容。我想知道是否有类似的东西可以解析任何类型的格式错误的HTML,或者至少可以获取HTML标记中的内容。。就像里面。。。就我而言??那也很好

或者任何我可以用来解析我从服务中得到的东西的东西都是好的,只要它是可适当实现的


请原谅我英语不好,因为上面的代码没有关闭

标记

<p> Some text <br /> </p>
一些文本


使用这一行。

您看到了这种行为,因为
..
标记中的内容不是文本元素,而是XML节点元素。您应该将内容包含在CDATA部分中

编辑:在评论中为我的建议提供代码段。它确实适用于您给出的示例XML

         StringBuffer html = new StringBuffer();
         int eventType = parser.getEventType();
         while (eventType != XmlPullParser.END_DOCUMENT) {
          if(eventType == XmlPullParser.START_TAG) {
              String name = parser.getName();
              if(name.equalsIgnoreCase("text")){
                  isText = true;
              }else if(isText){
                  html.append("<");
                  html.append(name);
                  html.append(">");
              }
          } else if(eventType == XmlPullParser.END_TAG) {
              String name = parser.getName();
              if(name.equalsIgnoreCase("text")){
                  isText = false;
              }else if(isText){
                  html.append("</");
                  html.append(name);
                  html.append(">");                   
              }
          } else if(eventType == XmlPullParser.TEXT) {
              if(isText){
                  html.append(parser.getText());
              }
          }
          eventType = parser.next();
         }
StringBuffer html=new-StringBuffer();
int eventType=parser.getEventType();
while(eventType!=XmlPullParser.END_文档){
if(eventType==XmlPullParser.START_标记){
String name=parser.getName();
if(name.equalsIgnoreCase(“文本”)){
isText=true;
}else if(isText){
html.append(“”);
}
}else if(eventType==XmlPullParser.END_标记){
String name=parser.getName();
if(name.equalsIgnoreCase(“文本”)){
isText=false;
}else if(isText){
html.append(“”);
}
}else if(eventType==XmlPullParser.TEXT){
if(isText){
append(parser.getText());
}
}
eventType=parser.next();
}
解决方案 由于采用了先将接收到的数据转换为字符串的方法,我以一种混合的方法处理了我的问题

将接收到的InputStream的值转换为字符串,并将错误的标记替换为“”(或您希望的任何标记):如下所示

InputStreamReader isr = new InputStreamReader(serviceReturnedStream);
BufferedReader br = new BufferedReader(isr);
StringBuilder xmlAsString = new StringBuilder(512);
String line;
try {
    while ((line = br.readLine()) != null) {
        xmlAsString.append(line.replace("<p>", "").replace("</p>", ""));
    }
} catch (IOException e) {
    e.printStackTrace();
}

希望这对别人有帮助

谢谢你,尼克。。但是这些数据是从一个完全不在我控制范围内的web服务返回的。。你能不能建议一些方法来得到里面的东西。。。元素+1给你。。但是我不能编辑返回的内容。。我无法访问返回此数据的web服务。如果您无法修改XML,您应该考虑从
开始标记到结束标记之后的任何内容构建HTML。例如,如果START_标记为“text”,则在它中设置一个标志,并将标记和文本附加到StringBuffer变量中,直到遇到END_标记,在此使用变量并重置标志。谢谢Rajesh。。但是我不认为我能在开始后继续。。。当我试图通过parser.nextText()获取后面的内容时。。我有个例外。。。但是如果你遇到/解决了这样的问题。。然后提供一个例子将有助于我认为你没有完全理解这个建议。请查看更新的答案。我已经用您提供的XML对它进行了测试。
InputStreamReader isr = new InputStreamReader(serviceReturnedStream);
BufferedReader br = new BufferedReader(isr);
StringBuilder xmlAsString = new StringBuilder(512);
String line;
try {
    while ((line = br.readLine()) != null) {
        xmlAsString.append(line.replace("<p>", "").replace("</p>", ""));
    }
} catch (IOException e) {
    e.printStackTrace();
}
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xmlAsString.toString()));