问题
Using org.json
and, crucially, JSONArray
rather than JSONObject
, managed to, seemingly at least, get XML
output through Twitter4J
. However, it shows as:
The Markup In The Document Following The Root Element Must Be Well-formed., Line '1', Column '98'.
The Markup In The Document Following The Root Element Must Be Well-formed.
When validation is attempted.
It does, however, have at least the appearance of XML
.
Assuming that BaseX
will wrangle the XML
sufficiently, I'm looking to add the document to a database as:
new Open(databaseName).execute(context);
for (int i = 0; i < tweets.length(); i++) {
jsonStringTweet = tweets.get(i).toString();
jsonObjectTweet = new org.json.JSONObject(jsonStringTweet);
stringXml = XML.toString(jsonObjectTweet);
log.info(stringXml);
new Add(null, stringXml).execute(context);
}
With reference to:
Constructor Detail
Add public Add(java.lang.String path) Constructor, specifying a target path. The input needs to be set via Command.setInput(InputStream). Parameters: path - target path, optionally terminated by a new file name Add public Add(java.lang.String path, java.lang.String input) Constructor, specifying a target path and an input. Parameters: path - target path, optionally terminated by a new file name. If null, the name of the input will be set as path. input - input file or XML string
However, I don't quite follow the requirements. The input seems to say that it will work with an XML
string, which, presumably is what is being passed. Is that the correct way to add XML
to a database?
Java Code:
package basex;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import java.util.logging.Logger;
import org.basex.core.BaseXException;
import org.basex.core.Context;
import org.basex.core.cmd.Add;
import org.basex.core.cmd.Open;
import org.basex.core.cmd.CreateDB;
import org.basex.core.cmd.DropDB;
import org.basex.core.cmd.List;
import org.basex.core.cmd.Set;
import org.json.XML;
import twitter4j.JSONArray;
import twitter4j.JSONException;
public class DatabaseHelper {
private static final Logger log = Logger.getLogger(DatabaseHelper.class.getName());
private Properties properties = new Properties();
private URL url = null;
private String databaseName = null;
private Context context = null;
private String parserType = null;
private DatabaseHelper() {
}
public DatabaseHelper(Properties properties) {
this.properties = properties;
}
private void init() throws MalformedURLException, BaseXException {
log.fine(properties.toString());
parserType = properties.getProperty("parserType");
url = new URL(properties.getProperty(parserType + "URL"));
databaseName = properties.getProperty("databaseName");
context = new Context();
list();
}
private void list() throws BaseXException {
log.fine(new List().execute(context));
}
private void drop() throws BaseXException {
new Set("parser", parserType).execute(context);
new DropDB(databaseName).execute(context);
list();
}
private void create() throws BaseXException, JSONException {
new Set("parser", parserType).execute(context);
new CreateDB(databaseName).execute(context);
new List().execute(context);
list();
}
private void add(JSONArray tweets) throws JSONException, BaseXException {
long id = 0L;
String jsonStringTweet = null;
org.json.JSONObject jsonObjectTweet = null;
String stringXml = null;
new Open(databaseName).execute(context);
for (int i = 0; i < tweets.length(); i++) {
jsonStringTweet = tweets.get(i).toString();
jsonObjectTweet = new org.json.JSONObject(jsonStringTweet);
stringXml = XML.toString(jsonObjectTweet);
log.info(stringXml);
new Add(null, stringXml).execute(context);
}
}
public void dropCreateAdd(JSONArray tweets) throws MalformedURLException, BaseXException, JSONException {
init();
drop();
create();
add(tweets);
list();
}
}
回答1:
sorta kinda works, at least can add an XML
file:
thufir@dur:~/NetBeansProjects/twitterBaseX$
thufir@dur:~/NetBeansProjects/twitterBaseX$ basex
BaseX 9.0.1 [Standalone]
Try 'help' to get more information.
>
> list
Name Resources Size Input Path
-------------------------------------------------------------------------------
com.w3schools.books 1 6290 https://www.w3schools.com/xml/books.xml
db 1 101838
twitter 15 5203
w3school_data 1 5209 https://www.w3schools.com/xml/note.xml
4 database(s).
>
> drop database twitter
Database 'twitter' was dropped.
>
> list
Name Resources Size Input Path
-------------------------------------------------------------------------------
com.w3schools.books 1 6290 https://www.w3schools.com/xml/books.xml
db 1 101838
w3school_data 1 5209 https://www.w3schools.com/xml/note.xml
3 database(s).
>
> exit
Have a nice day.
thufir@dur:~/NetBeansProjects/twitterBaseX$
thufir@dur:~/NetBeansProjects/twitterBaseX$ gradle clean run
> Task :run
/home/thufir/basex/.basex: writing new configuration file.
BUILD SUCCESSFUL in 2s
4 actionable tasks: 4 executed
thufir@dur:~/NetBeansProjects/twitterBaseX$
thufir@dur:~/NetBeansProjects/twitterBaseX$ basex
/home/thufir/basex/.basex: Unknown option 'RESTXQERRORS'.
/home/thufir/basex/.basex: writing new configuration file.
BaseX 9.0.1 [Standalone]
Try 'help' to get more information.
>
> list
Name Resources Size Input Path
-------------------------------------------------------------------------------
com.w3schools.books 1 6290 https://www.w3schools.com/xml/books.xml
db 1 101838
twitter 15 5203
w3school_data 1 5209 https://www.w3schools.com/xml/note.xml
4 database(s).
>
> open twitter
Database 'twitter' was opened in 57.09 ms.
>
> xquery /
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
<root>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</root>
Query executed in 232.89 ms.
>
code:
new Open(databaseName).execute(context);
for (int i = 0; i < tweets.length(); i++) {
jsonStringTweet = tweets.get(i).toString();
jsonObjectTweet = new org.json.JSONObject(jsonStringTweet);
stringXml = XML.toString(jsonObjectTweet);
log.fine(stringXml);
new Add(null, "data.xml").execute(context);
}
来源:https://stackoverflow.com/questions/60035605/how-to-add-an-xml-string-to-an-existing-basex-database